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