我有一列有兩種日期格式:
- 日/月/年
- YYYY-MM-DD
我想將此列的所有日期格式轉換為只有一種日期格式,即 'DD/MM/YYYY'
我如何在 Oracle SQL 中做到這一點?
提前致謝
uj5u.com熱心網友回復:
永遠不要將日期存盤為字串;始終使用DATEorTIMESTAMP資料型別。
TO_DATE從 Oracle 12 開始,您可以對具有不同格式模型的函式進行多次呼叫,并使用它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 2021-01-01 00:00:00 2022 年 12 月 31 日 2022-12-31 00:00:00
db<>在這里擺弄
uj5u.com熱心網友回復:
假設您只有這兩種格式,您可以執行以下操作:
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 的時間部分)。
uj5u.com熱心網友回復:
這是另一種方式。
字串資料對于存盤任何重要的東西都是可怕的。根據我使用的一個資料庫,華盛頓州有 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;
uj5u.com熱心網友回復:
謝謝你的所有答案
我實際上誤會了我的問題。
我有一個 varchar 列,其中包含格式為 DD/MM/YYYY、YYYY-MM-DD 的日期,并且我有不是日期的值,例如“xxxxx”、“1235687”。
我想通過說來執行案例
如果日期格式為 'YYYY-MM-DD' 則為 'DD/MM/YYYY' 如果日期格式為 'DD/MM/YYYY' 則為 'DD/MM/YYY' 如果它們不是日期則放空
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/448528.html
上一篇:添加日期間隔無法處理結束
