我有以下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。
导致此错误的原因是什么?
答案 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