[英]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 人,但我想出的是使用带有
EXTRACT
和ADD_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
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 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.