SQL Server 包含時區的日期時間格式 datetimeoffset

datetime2 是日期時間格式,資料精確度範例格式為 9999-12-31 23:59:59.9999999 ,而 datetimeoffset 就是 datetime2 再加上時區標記,可以有效的儲存不同地區的時間。

下面是一個示範用的建立資料表的語法:
    
create table Users
(
    UserName             nvarchar(256),
    CreatedAt            datetimeoffset
        constraint DF_Users_CreatedAt default sysutcdatetime() not null
)
    

在上面的語法中我們建立了 Users 這個資料表,其中 CreatedAt 這個欄位的資料型態就是 datetimeoffset ,我們還定義了使用 sysutcdatetime() 這個方法取得資料新增當下的時間作為預設值。
範例查詢結果為:
    
select UserName, CreatedAt from Users;
    
+--------+----------------------------------+
|UserName|CreatedAt                         |
+--------+----------------------------------+
|ruyut   |2024-08-28 23:30:38.3726345 +00:00|
+--------+----------------------------------+
    

更新 datetimeoffset 欄位的方式:
    
update Users set CreatedAt = '2024-08-28 23:30:38.3726340 +00:00'
where UserName = 'ruyut';
    

隨著後續資料增加,我們很可能會看到不同時區的資料:
    
select UserName, CreatedAt  from Users
    
+--------+----------------------------------+
|UserName|CreatedAt                         |
+--------+----------------------------------+
|ruyut   |2024-08-28 23:30:38.3726345 +00:00|
|user01  |2024-08-28 20:40:20.2705906 +08:00|
+--------+----------------------------------+
    

我們可以使用 switchoffset 方法來將所有資料的時區變為一致,方便我們查看資料。
例如將時區設定為 +08:00
    
select UserName
     , CreatedAt
     , switchoffset(CreatedAt, '+08:00') as LocalCreatedAt
from Users
    

範例查詢結果:
    
+--------+----------------------------------+----------------------------------+
|UserName|CreatedAt                         |LocalCreatedAt                    |
+--------+----------------------------------+----------------------------------+
|ruyut   |2024-08-28 23:30:38.3726340 +00:00|2024-08-29 07:30:38.3726340 +08:00|
|user01  |2024-08-28 20:40:20.2705900 +08:00|2024-08-28 20:40:20.2705900 +08:00|
+--------+----------------------------------+----------------------------------+
    

原始 CreatedAt 的資料有 +0 和 +8 的時區,經過 switchoffset 方法處理後的 LocalCreatedAt 資料就全部轉換為 +8 的時區顯示了。

參考資料:
Microsoft.Learn - datetimeoffset (Transact-SQL)
Microsoft.Learn - datetime2 (Transact-SQL)
Microsoft.Learn - SYSUTCDATETIME (Transact-SQL)
Microsoft.Learn - SWITCHOFFSET (Transact-SQL)

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com