Sql 带有日期和字符串的Case语句
我有以下错误,ORA-01841Sql 带有日期和字符串的Case语句,sql,oracle,Sql,Oracle,我有以下错误,ORA-01841 (完整)年份必须介于-4713和+9999之间,而不是0 错误来自下面的case语句 有没有关于发生了什么以及如何修复的帮助 SQL 选择 案例 当NVL(uap.U pend_dt,act_d_dt)>=TO_CHAR(TO_DATE(“.PENDING_DATE _CUTOFF.”,'YYYY-MM-DD'),'MM/DD/YYYY') 然后是NVL(uap.us_pend_dt,act_d_dt) 否则,当NVL(act_d_dt,SYSDATE)可能时,
(完整)年份必须介于-4713和+9999之间,而不是0
错误来自下面的case语句
有没有关于发生了什么以及如何修复的帮助
SQL
选择
案例
当NVL(uap.U pend_dt,act_d_dt)>=TO_CHAR(TO_DATE(“.PENDING_DATE _CUTOFF.”,'YYYY-MM-DD'),'MM/DD/YYYY')
然后是NVL(uap.us_pend_dt,act_d_dt)
否则,当NVL(act_d_dt,SYSDATE)可能时,日期列存储为日期。因此,将比较作为日期而不是字符串:
选择(NVL(uap.us pend_dt,act_d_dt)时的情况)>=截止日期(“.PENDING_DATE_CUTOFF.”,“.YYYY-MM-DD”)
然后是NVL(uap.us_pend_dt,act_d_dt)
当NVL(生效日期,系统日期)<截止日期(“.HIRE\u DATE\u CUTOFF.”,“.YYYY-MM-DD”)
然后行动起来
其他
结束)作为h_DT
您也不需要额外的大小写表达式。看起来您正在尝试将字符串“.挂起日期”转换为日期。我只是做了以下操作,得到了一个相同的错误:
SELECT TO_DATE('".PENDING_DATE_CUTOFF."', 'YYYY-MM-DD') FROM dual;
.PENDING\u DATE\u CUTOFF.
(带句点)是表中某列的名称吗?如果是,则省略单引号字符,例如:
SELECT TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') FROM dual;
当然,这将给出一个完全不同的错误[ORA-00904:“.PENDING_DATE_CUTOFF.”:如果按原样运行,则标识符无效!因此,我认为您可能需要以下内容(我假设其他日期列是实际日期,截止列是VARCHAR2
列,它们以yyy-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;
合并时选择案例(uap.us pend_dt,act_d_dt)>=TO_DATE(“.PENDING_DATE_CUTOFF.”,'YYYY-MM-DD'),然后合并(uap.us pend_dt,act_d_dt)
否则,当合并(生效日期,系统日期)<(截止日期(“.HIRE\u DATE\u CUTOFF.”,'YYYY-MM-DD')时,则生效日期
否则就采取行动
以h_dT结尾
从mytable;
注意,我还去掉了无关的CASE
语句,并将Oracle特有的NVL()
函数转换为ANSI标准的COALESCE()
函数
编辑:如果您的*\u dt
列是字符串而不是日期,最好在比较之前使用to\u DATE()
将它们转换为日期-这样您就可以将日期与日期进行比较
希望这能有所帮助。为什么要将日期值存储为字符串?这只是一个猜测,但这不是从一块代码中粘贴出来的,它实际上构建了这个SQL查询吗?PENDING_DATE\u CUTOFF
和HIRE_DATE\u CUTOFF
看起来有点像从应用程序传递到查询的值。如果是这样,你要么做错了(并将代码“出血”到查询中)或这些“变量”的值错误无论哪种方式,考虑使用绑定变量/参数化查询/准备语句,并保存自己和世界另一SQL注入攻击向量。匿名表决什么看起来像正确答案?我否决了答案,甚至不试图解决错误的OP收到,这是由于调用<代码> toed。ATE()
SELECT TO_DATE(".PENDING_DATE_CUTOFF.", 'YYYY-MM-DD') FROM dual;
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;