Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 ora-01843不是有效月份的情况_Sql_Oracle - Fatal编程技术网

如何修复sql ora-01843不是有效月份的情况

如何修复sql ora-01843不是有效月份的情况,sql,oracle,Sql,Oracle,运行sql脚本后,出现日期错误ora-01843不是有效的月份,日期格式为mm/dd/yyyy这在plsql上发生,但我不知道请参见下面的sql语句 SELECT COUNT(*) FROM (SELECT c1.end_date AS eddates,cc.effectiveto, CASE WHEN cc.effectiveto >= '1/1/4000' THEN '1/1/4000' WHEN cc.effectiveto is null THEN '1/1/400

运行sql脚本后,出现日期错误ora-01843不是有效的月份,日期格式为mm/dd/yyyy这在plsql上发生,但我不知道请参见下面的sql语句

SELECT COUNT(*) FROM 
(SELECT c1.end_date AS eddates,cc.effectiveto,
CASE WHEN cc.effectiveto >= '1/1/4000' THEN  '1/1/4000'
     WHEN cc.effectiveto is null THEN  '1/1/4000'
     WHEN cc.effectiveto < '1/1/4000' THEN to_char(cc.effectiveto)
  END mock_effectiveto 
from (select aa.*,b.perm_id
      from smf2.security_xref aa,
           smf2.t_security_source b
      where identifier_type_id = 4862
      and aa.security_id = b.security_id
      and b.data_source_id = 52992
      AND aa.data_source_id = 52985)c1,

      (Select bc.* 
      FROM ccc_bimbqm.instrument ab , ccc_bimbqm.identifier bc  
      WHERE bc.identifiertypepermid = 320015  
      AND ab.instrumentpermid = bc.objectpermid
      AND bc.objectpermid IN 
      (SELECT bondid FROM ccc_muni.munibonds)) cc
WHERE  c1.perm_id = cc.objectpermid
and c1.start_date = cc.effectivefrom
and cc.identifiervalue is not null
and c1.code is not NULL ) ax
WHERE ax.eddates <> mock_effectiveto 

您可以将您的案例陈述更新为-

CASE WHEN cc.effectiveto = TO_DATE('01/01/4000', 'MM/DD/YYYY') OR cc.effectiveto is null
          THEN TO_DATE('01/01/4000', 'MM/DD/YYYY')
     WHEN cc.effectiveto < TO_DATE('01/01/4000', 'MM/DD/YYYY')
          THEN to_char(cc.effectiveto)
END mock_effectiveto 

要问一个明显的问题,您的数据真的有4000年的日期吗?今天的提示:使用现代的显式连接语法。更容易编写而不出错,更容易阅读和维护,并且在需要时更容易转换为外部联接。我猜cc.effectiveto是日期格式,在这种情况下,您需要对所比较的内容进行更新。当cc.effectiveto>=TO_DATE'1/1/4000'@TineO时,您忘记将格式掩码放入您的TO_DATE中;如果没有这一点,它就有点无用,因为它依赖于NLS_DATE_FORMAT参数,这与您一开始没有执行to_DATE的情况相同。相反,它应该类似于日期'01/01/4000'、'dd/mm/yyyy'甚至,因为不需要时间元素,即设置为午夜:日期'4000-01-01'@Boneist:您应该添加,作为应答年份必须介于-4713和+9999之间,所以4000是possible@WernfriedDomscheit,接受并更新了答案。