将差异日期格式转换为一种格式-Oracle SQL



我有一列有两种日期格式:

  1. DD/MM/YYYY
  2. YYYY-MM-DD

我想将此列的所有日期格式转换为仅一种日期格式,它是"DD/MM/YYYY">

如何在Oracle SQL中执行此操作?

提前感谢

NEVER将日期存储为字符串;始终使用CCD_ 1或CCD_ 2数据类型。


从Oracle 12,您可以使用不同格式模型对TO_DATE函数进行多次调用,并使用DEFAULT NULL ON CONVERSION ERROR来防止引发错误,使用COALESCE来查找匹配项:

SELECT date_string_column,
COALESCE(
TO_DATE(
date_string_column DEFAULT NULL ON CONVERSION ERROR,
'fxDD/MM/YYYY'
),
TO_DATE(
date_string_column DEFAULT NULL ON CONVERSION ERROR,
'fxYYYY-MM-DD'
)
) AS date_value
FROM   table_name

对于样本数据:

CREATE TABLE table_name (date_string_column) AS
SELECT '2021-01-01' FROM DUAL UNION ALL
SELECT '31/12/2022' FROM DUAL;

输出:

DATE_STRING_COLUMNDATE_VALUE
2021-01-0120211-01-01 00:00:00
2022年12月31日2021-12-31 00:00:00

假设您只有这两种格式,您可以执行以下操作:

select (case when instr(columnName, '/') > 1 then 
to_date(columnName, 'DD/MM/YYYY') 
else to_date(columnName, 'YYYY-MM-DD') 
end) field_as_date 
from tableName;

这将为您提供columnName作为日期(没有c的时间部分(。

这里有另一种方法。

字符串数据对于存储任何重要内容来说都很糟糕。根据我合作的一个数据库,华盛顿州有4000多个县。还有大约15种拼写";3M";。您可能还需要找到清理数据或处理该列中的非日期数据的方法。

with dt (dt) as (
select cast('2021-01-31' as varchar2(50))
from dual
union select cast('31/01/2021' as varchar2(50))
from dual
)
select 
dt
, to_date(
regexp_replace(
regexp_replace(
dt
, '([[:digit:]]{2})/([[:digit:]]{2})/([[:digit:]]{4})'
, '3-2-1'
)
, '([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})'
, '1-2-3'
)
, 'yyyy-mm-dd'
) "dt"
from dt;

相关内容

  • 没有找到相关文章

最新更新