iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 5
0
Data Technology

SQL Server 學習日誌系列 第 5

05.DATETIME、DATETIMEOFFSET、SYSDATETIMEOFFSET()、SWITCHOFFSET() 函式與應用

2020.7.9 更新,突然發現自己在這邊的文章有破圖,還好當時在自己部落格有備份
若有興趣看正常文章的朋友,可以到我的部落格:序列函數 RANK, DENSE_RANK, NTILE 介紹與比較

前言

過去經手的程式與專案多數都是對於台灣的客戶,很少需要面對時區不同情境出現。直到目前工作需求,資料欄位需要紀錄時區,新功能開發過程中,建立資料表與撰寫 Stored Procedure 後才發現時間轉換問題頗大,但木已成舟,只好花費更多心力進行修改。這一次,剛好藉鐵人賽這個機會徹底學習與紀錄這些關於時間的用法。


介紹

DATETIME
是一種時間資料型態,主要紀錄年月日與時間,不包含時區,通常我們可以透過 GETDATE() 取得目前時間。

DECLARE @date DATETIME = GETDATE();
SELECT @date

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514006479632_image.png

DATEOFFSET
是一種時間資料型態,紀錄內容較 DATETIME 詳細,也包含時區。通常我們透過 SYSDATETIMEOFFSET() 取得系統時間

DECLARE @dateOffset DATETIMEOFFSET = SYSDATETIMEOFFSET();
SELECT @dateOffset

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514006672211_image.png

取得時間與系統時間的差異:系統時間較詳細,取得位數較多

SELECT SYSDATETIME() AS SystemDateTime,
       GETDATE() AS GetDateTime

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514006751332_image.png

你會發現,上面範例時間時區為 +00:00,若要取得我們所在 +08:00 時區,你可以透過SWITCHOFFSET 函式:

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
SELECT @dt

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514006939371_image.png

如果是沒有時區的 DATETIME 資料要轉換成 DATETIMEOFFSET 呢? 你可以透過 CONVERT 函式

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET (CONVERT(DATETIMEOFFSET, GETDATE()), '+08:00')
SELECT @dt

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514007013409_image.png

若你想要取得前一小時或後一天的時間,你可以透過 DATEADD 函式。DATEADD 需要三個參數,分別為時間單位、增減數、時間資料。

DECLARE @dt DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
SELECT @dt
SELECT DATEADD (HOUR , 1 , @dt ) 

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514007614809_image.png

若你要知道兩個時間資料差異多少,可以透過DATEFIFF 函式。DATEFIFF需要三個參數,分別為時間單位、起始時間、結束時間。

DECLARE @startDateTime DATETIMEOFFSET = SWITCHOFFSET ( SYSDATETIMEOFFSET(), '+08:00')
DECLARE @endDateTime DATETIMEOFFSET = DATEADD (HOUR , 1 , @startDateTime ) 
SELECT DATEDIFF(MINUTE, @startDateTime, @endDateTime)

https://d2mxuefqeaa7sj.cloudfront.net/s_CB761DC6CF4DFCAE822EE4BF02A3367558CFA9B8F6D199AFB135AB507EE588BC_1514007835917_image.png


上一篇
04.ROW_NUMBER 次序函數與使用
下一篇
06. 應用:取得當週為星期幾、當週/月/年第一天與最後一天
系列文
SQL Server 學習日誌30

尚未有邦友留言

立即登入留言