简体   繁体   English

Oracle 19c - 零填充年

[英]Oracle 19c - Zero padded year

I have some zero padded year DATE column values (eg 0018-04-30), but not all values.我有一些零填充年份 DATE 列值(例如 0018-04-30),但不是所有值。 Most are 4 digit years (eg 2022).大多数是 4 位数年份(例如 2022 年)。 What's the most efficient way of converting to a year with century (ie 2018-04-30).转换为带有世纪的年份的最有效方法是什么(即 2018-04-30)。

I'm not a Oracle guy, but what I came up with is to use a CASE statement with EXTRACT and ADD_MONTHS functions:我不是 Oracle 人,但我想出的是使用带有EXTRACTADD_MONTHS函数的CASE语句:

CASE 
    WHEN EXTRACT(YEAR FROM DateColumn) < 1000 THEN ADD_MONTHS(DateColumn,(12*2000)) 
    ELSE DateColumn 
END

Example:例子:

SELECT
    TO_CHAR(
        CASE 
            WHEN EXTRACT(YEAR FROM (DATE '18-04-30')) < 1000 THEN ADD_MONTHS((DATE '18-04-30'),(12*2000)) 
            ELSE (DATE '18-04-30') 
        END,'YYYY-MM-DD') AS CorrectedDate
FROM DUAL ;

Is there a better, more efficient, way of doing this?有没有更好、更有效的方法来做到这一点?

Use an INTERVAL literal to add 2000 years to your dates:使用 INTERVAL 文字将 2000 年添加到您的日期:

SELECT dt + INTERVAL '2000' YEAR(4)
  FROM DATE_TABLE

db<>fiddle here db<>在这里摆弄

Also, your CASE expression can be a bit simpler:此外,您的 CASE 表达式可以更简单一些:

CASE 
  WHEN DateColumn < DATE '1000-01-01' THEN DateColumn + INTERVAL '2000' YEAR(4)
  ELSE DateColumn 
END

You may remove leading zeroes from the date using ltrim function and use RR date format element to convert the result to a date, which was introduced for y2k problem (I presume this is the source of such dates):您可以使用ltrim函数从日期中删除前导零,并使用RR日期格式元素将结果转换为日期,这是为 y2k 问题引入的(我认为这是此类日期的来源):

 with dates(dt) as ( select * from sys.odcidatelist( date '0018-04-30', date '3018-05-30', date '0070-12-29' ) ) select to_date( ltrim(to_char(dt, 'yyyy-mm-dd'), '0'), 'rr-mm-dd' ) as dt from dates;
| | DT | DT |
| | :--------- | :--------- |
| | 2018-04-30 | 2018-04-30 |
| | 3018-05-30 | 3018-05-30 |
| | 1970-12-29 | 1970-12-29 |

db<>fiddle here db<> 在这里摆弄

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM