我遇到以下错误,ORA-01841
(full) year must be between -4713 and +9999 and not be 0
错误来自下面的case语句。
有关发生的事情以及如何解决的任何帮助吗?
SQL
SELECT
CASE
WHEN NVL(uap.us_pend_dt, act_d_dt) >= TO_CHAR(TO_DATE('".PENDING_DATE_CUTOFF."','YYYY-MM-DD'),'mm/dd/yyyy')
THEN NVL(uap.us_pend_dt, act_d_dt)
ELSE CASE WHEN NVL(act_d_dt, SYSDATE) <TO_CHAR(TO_DATE('".HIRE_DATE_CUTOFF."','YYYY-MM-DD'),'mm/dd/yyyy')
THEN act_d_dt
ELSE ua_dt
END
END AS h_DT
答案 0 :(得分:0)
您似乎正在尝试将字符串".PENDING_DATE_CUTOFF."
转换为日期。我只是做了以下操作,并得到了相同的错误:
SELECT TO_DATE('".PENDING_DATE_CUTOFF."', 'YYYY-MM-DD') FROM dual;
.PENDING_DATE_CUTOFF.
(带句点)是表中列的名称吗?如果是这样,则省略单引号字符,例如:
SELECT TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') FROM dual;
如果按原样运行,这当然会给出完全不同的错误[ORA-00904: ".PENDING_DATE_CUTOFF.": invalid identifier
]!因此,我认为您可能需要类似以下内容(我假设其他日期列为实际日期,而截止列为VARCHAR2
列,它们以YYYY-MM-DD
格式存储日期:
SELECT CASE WHEN COALESCE(uap.us_pend_dt, act_d_dt) >= TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') THEN COALESCE(uap.us_pend_dt, act_d_dt)
ELSE WHEN COALESCE(act_d_dt, SYSDATE) < (TO_DATE(".HIRE_DATE_CUTOFF.", 'YYYY-MM-DD') THEN act_d_dt
ELSE act_d_dt
END AS h_dT
FROM mytable;
请注意,我还摆脱了多余的CASE
语句,并将特定于Oracle的NVL()
函数转换为ANSI标准的COALESCE()
函数。
编辑:如果您的*_dt
列是字符串而不是日期,最好使用TO_DATE()
之前将它们转换为日期-这样您就可以将日期与日期进行比较。
希望这会有所帮助。
答案 1 :(得分:-1)
大概您的日期列存储为日期。因此,将比较作为日期而不是字符串:
SELECT (CASE WHEN NVL(uap.us_pend_dt, act_d_dt) >= TO_DATE('".PENDING_DATE_CUTOFF."', 'YYYY-MM-DD')
THEN NVL(uap.us_pend_dt, act_d_dt)
WHEN NVL(act_d_dt, SYSDATE) < TO_DATE('".HIRE_DATE_CUTOFF."', 'YYYY-MM-DD')
THEN act_d_dt
ELSE ua_dt
END) AS h_DT
您也不需要多余的case
表达式。