datetime2 是日期時間格式,資料精確度範例格式為 9999-12-31 23:59:59.9999999 ,而 datetimeoffset 就是 datetime2 再加上時區標記,可以有效的儲存不同地區的時間。
下面是一個示範用的建立資料表的語法:
在上面的語法中我們建立了 Users 這個資料表,其中 CreatedAt 這個欄位的資料型態就是 datetimeoffset ,我們還定義了使用 sysutcdatetime() 這個方法取得資料新增當下的時間作為預設值。
範例查詢結果為:
更新 datetimeoffset 欄位的方式:
隨著後續資料增加,我們很可能會看到不同時區的資料:
我們可以使用 switchoffset 方法來將所有資料的時區變為一致,方便我們查看資料。
例如將時區設定為 +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)
下面是一個示範用的建立資料表的語法:
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)
感謝教學~
回覆刪除