我有下面的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我面临的问题是,我得到ORA-01861,即使日期是有效的日期格式(Yyyymmdd)。
造成这一错误的原因是什么?
发布于 2017-04-13 18:15:09
您根本不应该将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发布于 2017-04-13 18:00:14
号码转换问题(to_chat是什么?)我想你只是想在没有时间的情况下约会。
尝试TRUNC:
WHERE trunc(sysdate) between trunc(T1.WEB_STR_DT) and trunc(T1.WEB_STR_DT)+30https://stackoverflow.com/questions/43398827
复制相似问题