带日期和字符串的案例声明

时间:2018-07-02 18:48:30

标签: sql oracle

我遇到以下错误,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

2 个答案:

答案 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表达式。