【发布时间】: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:您应该将其添加为答案