Oracle转PostgreSQL日期处理SQL报错:date field value out of range的解决求助
Oracle转PostgreSQL日期处理SQL报错:date field value out of range的解决求助
各位PostgreSQL的大佬们好,我最近在做Oracle到PostgreSQL的SQL迁移,卡在日期处理这块了,求支招!
先给大家看我原来的Oracle代码逻辑:
CASE WHEN (:dateOfBirthYear IS NULL OR :dateOfBirthMonth IS NULL OR :dateOfBirthDay IS NULL) THEN NULL ELSE to_date(to_char(:dateOfBirthYear) || to_char(:dateOfBirthMonth, '00') || to_char(:dateOfBirthDay, '00'), 'YYYY mm DD') END
我想着PostgreSQL有专门的make_date()函数,用起来应该更简洁,就改成了下面这段:
CASE WHEN (:dateOfBirthYear IS NULL OR :dateOfBirthMonth IS NULL OR :dateOfBirthDay IS NULL) THEN NULL ELSE make_date(:dateOfBirthYear, :dateOfBirthMonth, :dateOfBirthDay) END
结果跑起来直接报错,错误日志是这样的:
org.postgresql.util.PSQLException: ERROR: date field value out of range: 0-00-00
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2733) ~[postgresql-42.7.5.jar:42.7.5]
排查后发现问题出在传入的参数上——有时候前端或者上游传的不是NULL,而是空值或者0值(比如年份传0,月份传00),这时候make_date()直接就炸了,毕竟0年0月0日完全不是合法的日期格式。
现在我想请教各位,有没有办法修改这段SQL,让它能兼容这种空值/0值的情况呀?不需要生成什么特殊日期,只要像原来Oracle逻辑那样返回NULL就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

