NUMBER(8) 列出现 ORA-01861 错误

ORA-01861 error on NUMBER(8) column

我有以下 SQL,它基本上检查 "SYSDATE" 是否适合特定日期(即某个日期 <= SYSDATE <= 某个日期 + 30 天)。

TO_DATE(TO_CHAR(SYSDATE, 'YYYYMMDD')) BETWEEN TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD')) AND
    TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD')) + 30

我面临的问题是,即使日期是有效日期格式 (yyyymmdd),我也会收到 ORA-01861。

导致此错误的原因可能是什么?

数字转换问题(什么是 to_chat?)...我假设您只想要没有时间的日期。

尝试截断:

WHERE trunc(sysdate) between trunc(T1.WEB_STR_DT) and trunc(T1.WEB_STR_DT)+30

您根本不应该将 sysdate 与字符串相互转换,因为这很浪费,但同时也在进行隐式转换 - 这就是导致 ORA-018611 错误的原因。你的 NLS_DATE_FORMAT 不是 YYYYMMDD;您明确地将日期转换为该格式,然后尝试使用当前的 NLS 设置将结果字符串转换回日期:

select to_date(to_char(sysdate, 'YYYYMMDD')) from dual;

ORA-01861: literal does not match format string

select to_date(to_char(sysdate, 'YYYYMMDD'), 'YYYYMMDD') from dual;

TO_DATE(T
---------
13-APR-17

但是您可以使用 trunc(sysdate) 代替它。这会将时间带回午夜,因此如果 WEB_STR_DT 今天表示,它将匹配。

但这不是唯一的问题。您不应该首先将日期存储为数字,但是如果您必须将 20170413 之类的数字转换为日期,那么您需要先将其转换为字符串,然后再将该字符串转换为日期。

基本上你的括号放错了地方,而不是

TO_DATE(TO_CHAR(T1.WEB_STR_DT, 'YYYYMMDD'))

你应该有:

TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD')

您的代码相当于:

select to_date(to_char(20170413, 'YYYYMMDD')) from dual;

ORA-01481: invalid number format model

因为您正在尝试使用日期格式模型元素将数字转换为字符串。移动括号后,您最终会得到相同的日期。

所以,你可以这样做:

TRUNC(SYSDATE) BETWEEN TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD')
  AND TO_DATE(TO_CHAR(T1.WEB_STR_DT), 'YYYYMMDD') + 30

甚至显式 TO_CHAR() 调用也有点不必要,因为您没有为这些调用提供格式模型,所以更简单的是:

TRUNC(SYSDATE) BETWEEN TO_DATE(T1.WEB_STR_DT, 'YYYYMMDD')
  AND TO_DATE(T1.WEB_STR_DT, 'YYYYMMDD') + 30