根据年,月和日创建日期

Álv*_*lez 3 sql oracle oracle-xe oracle10g

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

我知道,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;
Run Code Online (Sandbox Code Playgroud)

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

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

Gor*_*off 5

例如,您可以使用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)
Run Code Online (Sandbox Code Playgroud)

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

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