【问题标题】:how to fix this case sql ora-01843 not a valid month如何解决这种情况 sql ora-01843 not a valid month
【发布时间】:2019-10-15 07:47:43
【问题描述】:

运行sql脚本后,出现日期错误“ora-01843 not a valid month”,日期格式为(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 

【问题讨论】:

  • 问一个显而易见的问题,你的数据真的有 4000 年的日期吗?
  • 今日提示:使用现代、明确的JOIN 语法。更容易编写(没有错误),更容易阅读(和维护),如果需要更容易转换为外连接
  • 我猜 cc.effectiveto 是 DATE 格式,在这种情况下,您需要对要比较的内容执行 TO_DATE。" WHEN cc.effectiveto >= TO_DATE('1/1/4000' )"
  • @TineO 你忘了把格式掩码放在你的to_date 中;没有它,它有点没用,因为它依赖于 NLS_DATE_FORMAT 参数,这就像你一开始没有完成 to_date 一样。相反,它应该类似于 to_date('01/01/4000', 'dd/mm/yyyy') 甚至,因为不需要时间元素(即设置为午夜):DATE '4000-01-01'
  • @Boneist:您应该将其添加为答案

标签: sql oracle


【解决方案1】:

您可以将 CASE 语句更新为 -

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 

【讨论】:

  • 年份必须在 -4713 和 +9999 之间,所以 4000 是可能的
  • @WernfriedDomscheit,接受并更新了答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多