Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 带有日期和字符串的Case语句_Sql_Oracle - Fatal编程技术网

Sql 带有日期和字符串的Case语句

Sql 带有日期和字符串的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)可能时,

我有以下错误,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)可能时,日期列存储为日期。因此,将比较作为日期而不是字符串:

选择(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;