2020.7.9 更新,突然發現自己在這邊的文章有破圖,還好當時在自己部落格有備份
若有興趣看正常文章的朋友,可以到我的部落格:序列函數 RANK, DENSE_RANK, NTILE 介紹與比較
過去經手的程式與專案多數都是對於台灣的客戶,很少需要面對時區不同情境出現。直到目前工作需求,資料欄位需要紀錄時區,新功能開發過程中,建立資料表與撰寫 Stored Procedure 後才發現時間轉換問題頗大,但木已成舟,只好花費更多心力進行修改。這一次,剛好藉鐵人賽這個機會徹底學習與紀錄這些關於時間的用法。
DATETIME
是一種時間資料型態,主要紀錄年月日與時間,不包含時區,通常我們可以透過 GETDATE() 取得目前時間。
DECLARE @date DATETIME = GETDATE();
SELECT @date
DATEOFFSET
是一種時間資料型態,紀錄內容較 DATETIME 詳細,也包含時區。通常我們透過 SYSDATETIMEOFFSET() 取得系統時間
DECLARE @dateOffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT @dateOffset
取得時間與系統時間的差異:系統時間較詳細,取得位數較多
SELECT SYSDATETIME() AS SystemDateTime,
GETDATE() AS GetDateTime
你會發現,上面範例時間時區為 +00:00,若要取得我們所在 +08:00 時區,你可以透過SWITCHOFFSET 函式:
DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
SELECT @dt
如果是沒有時區的 DATETIME 資料要轉換成 DATETIMEOFFSET 呢? 你可以透過 CONVERT 函式
DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET (CONVERT(DATETIMEOFFSET, GETDATE()), '+08:00')
SELECT @dt
若你想要取得前一小時或後一天的時間,你可以透過 DATEADD 函式。DATEADD 需要三個參數,分別為時間單位、增減數、時間資料。
DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
SELECT @dt
SELECT DATEADD (HOUR , 1 , @dt )
若你要知道兩個時間資料差異多少,可以透過DATEFIFF 函式。DATEFIFF需要三個參數,分別為時間單位、起始時間、結束時間。
DECLARE @startDateTime DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
DECLARE @endDateTime DATETIMEOFFSET = DATEADD (HOUR , 1 , @startDateTime )
SELECT DATEDIFF(MINUTE, @startDateTime, @endDateTime)