2018年1月13日 星期六

[MSSQL] 如何簡便快速將[日期]、[時間]兩欄位合併轉換為日期型態

許多設計偏好將[日期型態]資料拆分成[日期][時間]兩個欄位資料(字串或數值型態),對於ORACLE而言,可直接使用TO_DATE函數進行各態樣的日期字串的轉換成日期型態。MSSQL透過CAST進行日期轉換,但需符合兩項重點: 1.日期、時間中間需含空白及2. 時間間隔符號(:),因此需先處理以符合轉換格式,也可使用本範例所介紹agent_datetime內建函數,簡化煩瑣處理步驟。 

SELECT TRADE_DATE, TRADE_TIME
     --方法1: 一般作法 (需先處理符合日期轉換格)
     , CAST(E.TRADE_DATE + ' '
            + SUBSTRING(E.TRADE_TIME, 1, 2) + ':'
            + SUBSTRING(E.TRADE_TIME, 3, 2) + ':'
            + SUBSTRING(E.TRADE_TIME, 5, 2)
                 AS DATETIME
            ) TR_DT
     ----
     --方法2: 使用agent_datetime函數
     , msdb.dbo.agent_datetime(TRADE_DATE, TRADE_TIME) TR_DT2
FROM     
    (
    --嘗試轉型為數字
    --SELECT 20180112 TRADE_DATE,    081500 TRADE_TIME--重要範例
    --UNION ALL
    SELECT '20180112' TRADE_DATE, '081500' TRADE_TIME
    UNION ALL
    SELECT '20180112' TRADE_DATE, '131500' TRADE_TIME
    UNION ALL  
    SELECT '20180112' TRADE_DATE, '131530' TRADE_TIME
    ) E


[日期型態]資料拆分成[日期][時間]兩個文字或數值型態的欄位資料,雖可簡化純指令式的Ad hoc查詢處理,但後續如需日期運算則內建函數無法直接使用,需先行轉態。本範例所介紹agent_datetime內建函數可輕鬆完成完成換程序,如使用數值型態方式時,則更可凸顯其方便性,以早上08:15:00如以數值型態儲存時則變為081500,當轉換時,更需額外處理補足碼問題。

沒有留言:

張貼留言