一尘不染

根据年,月和日创建日期

sql

Oracle是否具有内置功能来根据其各个组成部分(年,月和日)创建仅对缺失数据返回null的日期?

我知道,TO_DATE()但是我需要首先编写一个字符串,并且||运算符和CONCAT()函数都无法轻松处理丢失的数据:

-- my_year NUMBER(4,0) NULL
SELECT TO_DATE(my_year || '-01-01', 'YYYY-MM-DD') AS my_date
FROM my_table;

只要my_yearNULL我们最终TO_DATE('-01-01', 'YYYY-MM-DD')和:

ORA-01841: (full) year must be between -4713 and +9999, and not be 0

阅读 118

收藏
2021-03-08

共1个答案

一尘不染

例如,您可以使用case

select (case when my_year is not null and my_year <> 0 and
                  my_year between -4713 and 9999
             then TO_DATE(my_year || '-01-01', 'YYYY-MM-DD')
        end)

不幸的是,Oracle没有一种方法(如果可能)进行转换,否则将返回NULL。SQL Server最近try_convert()为此目的而引入。

一种选择是为失败的转换编写带有异常处理程序的函数。异常处理程序只会返回NULL错误的格式。

2021-03-08