NUMBER(8)列上的ORA-01861错误

时间:2017-04-13 17:57:37

标签: sql oracle oracle12c

我有以下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。

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

2 个答案:

答案 0 :(得分:1)

号码转换问题(以及filter是什么?)...我假设你只想要没有时间约会。

尝试TRUNC:

to_chat

答案 1 :(得分:1)

你根本不应该将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之类的数字转换为日期,则需要先将其转换为字符串,然后将该字符串转换为日期。 / p>

基本上,你的括号位于错误的位置,而不是

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