将年、月和日三列转换为单个日期 Oracle

Hat*_*tik 0 oracle date type-conversion

我有一个以不同方式保存日期的表格,三列,一列代表年,另一列代表月,另一列代表日。因为我想使用日期比较,所以我需要它们作为日期格式的标准单列。例子:

 YEAR | MONTH | DAY
+-----+-------+-----+
 2011 | 01    | 01
Run Code Online (Sandbox Code Playgroud)

想要的结果是日期yyyy-mm-dd格式。到目前为止,我已经搜索并找到了一些解决方案,但我无法使它们工作 -首先在 Oracle 中不起作用,其次是更数学的解决方案:

select (2011-1900)*10000 +1*100 +1 (date) from dual;
Run Code Online (Sandbox Code Playgroud)

给出错误: ORA-00936: missing expression

我该怎么做才能达到预期的结果?不使用数学可能有另一种解决方案吗?

tri*_*cot 5

您不应该针对日期格式,而应该针对日期类型。格式只是在显示器上呈现此类日期的一种方式,但日期类型在日期计算和比较中最容易使用。

因此,假设您的三列是字符串类型,它们总是像您的示例中那样填充零(即一月01不是1),您可以这样做:

select to_date(year || month || day, 'YYYYMMDD') from dual 
Run Code Online (Sandbox Code Playgroud)

如果您的列是数字:

select to_date(to_char(year, 'FM0000') || to_char(month, 'FM00')
            || to_char(day, 'FM00'), 'YYYYMMDD') from dual 
Run Code Online (Sandbox Code Playgroud)

如果你真的需要直接从三个值计算的文本格式:

select year || '-' || month || '-' || day from dual 
Run Code Online (Sandbox Code Playgroud)

同样,如果您的列是数字:

select to_char(year, 'FM0000') || '-' || to_char(month, 'FM00')
                               || '-' || to_char(day, 'FM00') from dual 
Run Code Online (Sandbox Code Playgroud)