我有一列有两种日期格式:
- DD/MM/YYYY
- 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_COLUMN DATE_VALUE 2021-01-01 20211-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;