datetimeoffset (Transact-SQL)
適用於:MICROSOFT網狀架構倉儲中的 SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體 Azure Synapse Analytics Analytics Platform System (PDW) SQL 分析端點,Microsoft網狀架構 SQL 資料庫Microsoft網狀架構
根據 datetime2 等 24 小時制,定義與一天時間結合的日期,並根據國際標準時間 (UTC) 新增時區感知。
datetimeoffset 描述
屬性 | 值 |
---|---|
語法 | DATETIMEOFFSET [ ( 小數秒精確度 ) ] |
使用方式 | DECLARE @MyDatetimeoffset DATETIMEOFFSET(7); CREATE TABLE Table1 (Column1 DATETIMEOFFSET(7)); |
預設字串常值格式 (用於下層用戶端) | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [{+|-}hh:mm] 如需詳細資訊,請參閱 後續下層用戶端 的回溯相容性一節。 |
日期範圍 | 0001-01-01 至 9999-12-31 公元 1 年 1 月 1 日到公元 9999 年 12 月 31 日 |
時間範圍 | 00:00:00 至 23:59:59.9999999 |
時區位移範圍 | -14:00 至 +14:00 |
項目範圍 | yyyy 是四位數,範圍從 0001 到 9999 ,代表一年。MM 是兩位數,範圍從 01 到 12 ,代表指定年份中的月份。dd 是兩位數,範圍 01 從 到 31 ,視月份而定,代表指定月份的一天。HH 是兩位數,範圍從 00 到 23 ,代表小時。mm 是兩位數,範圍從 00 到 59 ,代表分鐘。ss 是兩位數,範圍從 00 到 59 ,代表第二個數位。n 是零到七位數,範圍從 0 到 9999999 ,代表小數秒。hh 是範圍從 -14 到 +14 的兩位數。mm 是範圍從 00 到 59 的兩位數。 |
字元長度 | 最小 26 個位置 (yyyy-MM-dd HH:mm:ss {+|-}hh:mm) 到 34 最大值 (yyyy-MM-dd HH:mm:ss.nnnnnn {+|-}hh:mm) |
精確度、小數位數 | 請參閱下表。 |
儲存體大小 | 10 個字節,固定是預設值,預設值為100-ns小數秒有效位數。 |
準確度 | 100 奈秒 |
預設值 | 1900-01-01 00:00:00 00:00 |
Calendar | 西曆 |
用戶定義的小數秒有效位數 | Yes |
時區位移感知與保留 | Yes |
日光節約感知 | 否 |
指定的小數位數 | 結果 (有效位數,小數位數) | 資料行長度 (以位元組為單位) | 小數秒數有效位數 |
---|---|---|---|
datetimeoffset | (34, 7) | 10 | 7 |
datetimeoffset(0) | (26, 0) | 8 | 0 到 2 |
datetimeoffset(1) | (28, 1) | 8 | 0 到 2 |
datetimeoffset(2) | (29, 2) | 8 | 0 到 2 |
datetimeoffset(3) | (30, 3) | 9 | 3 到 4 |
datetimeoffset(4) | (31, 4) | 9 | 3 到 4 |
datetimeoffset(5) | (32, 5) | 10 | 5 到 7 |
datetimeoffset(6) | (33, 6) | 10 | 5 到 7 |
datetimeoffset(7) | (34, 7) | 10 | 5 到 7 |
datetimeoffset 支援的字串常值格式
下表將列出 datetimeoffset 支援的 ISO 8601 字串常值格式。 如需 datetimeoffset 日期和時間部分的字母、數值、未分隔及時間格式的相關信息,請參閱 date (Transact-SQL) 和時間 (Transact-SQL)。
ISO 8601 | 描述 |
---|---|
yyyy-MM-ddTHH:mm:ss[.nnnnnnn][{+|-}hh:mm] | 這兩種格式不會受到 SET LANGUAGE 和 SET DATEFORMAT 會話地區設定的影響。 datetimeoffset 與 datetime 元件之間不允許空格。 |
yyyy-MM-ddTHH:mm:ss[.nnnnnnn]Z (UTC) | 根據 ISO 定義,這種格式表示 datetime 部分應該以國際標準時間 (UTC) 來表示。 例如, 1999-12-12 12:30:30.12345 -07:00 應該表示為 1999-12-12 19:30:30.12345Z 。 |
下列範例會比較將字串轉換成各種 date 和 time 資料類型的結果。
SELECT CAST('2007-05-08 12:35:29. 1234567 +12:15' AS TIME(7)) AS 'time',
CAST('2007-05-08 12:35:29. 1234567 +12:15' AS DATE) AS 'date',
CAST('2007-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST('2007-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIME2(7)) AS 'datetime2',
CAST('2007-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset',
CAST('2007-05-08 12:35:29.1234567+12:15' AS DATETIMEOFFSET(7)) AS 'datetimeoffset IS08601';
結果集如下所示。
資料類型 | 輸出 |
---|---|
time |
12:35:29.1234567 |
date |
2007-05-08 |
smalldatetime |
2007-05-08 12:35:00 |
datetime |
2007-05-08 12:35:29.123 |
datetime2 |
2007-05-08 12:35:29.1234567 |
datetimeoffset |
2007-05-08 12:35:29.1234567 +12:15 |
datetimeoffset IS08601 |
2007-05-08 12:35:29.1234567 +12:15 |
時區位移
時區位移指定 time 或 datetime 值從 UTC 算起的時區位移。 時區位移可表示成 [+|-] hh:mm:
hh
是介於和14
之間的兩位數,00
代表時區位移中的時數。mm
是兩位數,範圍從00
到59
,代表時區位移中額外分鐘數。+
(加號) 或-
(減號) 是時區位移的必要標誌。 此符號指出時區位移是從UTC時間新增或減去,以取得當地時間。 時區位移的有效範圍是從-14:00
到+14:00
。
時區位移範圍遵循 XSD 架構定義的 W3C XML 標準,而且與 SQL 2003 標準定義稍有不同, 12:59
與 +14:00
。
選擇性的類型參數「毫秒精確度」會指定秒鐘小數部分的位數。 這個值可以是介於 0 至 7 (100 奈秒) 之間的整數。 默認 的小數秒精確度 為100 ns(秒小數部分的七位數)。
這項資料會儲存於資料庫中,而且在伺服器中進行處理、比較、儲存和索引 (如同 UTC)。 時區位移會保留於資料庫中以供擷取。
指定時區位移假設為日光節約時間 (DST) 感知,並針對 DST 期間中的任何指定 日期時間 進行調整。
對於 datetimeoffset 類型,UTC 和 local (持續或轉換的時區位移) 日期時間 值會在插入、更新、算術、轉換或指派作業期間進行驗證。 偵測到任何無效的 UTC 或本機 (持續或轉換的時區位移) 日期時間 值會引發無效的值錯誤。 例如, 9999-12-31 10:10:00
在 UTC 中有效,但本地時間溢位至時區位移 +13:50
。
時區轉換語法
SQL Server 2016 (13.x) 引進 AT TIME ZONE
了語法,以促進日光節約感知的通用時區轉換。 將沒有時區位移的數據轉換成具有時區位移的數據時,此語法特別有用。 若要轉換成目標時區中的對應 datetimeoffset 值,請參閱 AT TIME ZONE。
ANSI 和 ISO 8601 合規性
日期和時間發行項的 ANSI 和 ISO 8601 合規性區段適用於 datetimeoffset。
下層用戶端的回溯相容性
有些下層用戶端不支援 time、date、datetime2 及 datetimeoffset 資料類型。 下表顯示上層 SQL Server 執行個體與下層用戶端之間的類型對應。
SQL Server 資料類型 | 傳遞至下層用戶端的預設字串常值格式 | 下層 ODBC | 下層 OLEDB | 下層 JDBC | 下層 SQLCLIENT |
---|---|---|---|---|---|
time | HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 或 SqString |
date | yyyy-MM-dd | SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] | SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm | SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTRor DBTYPE_STR |
Java.sql.String |
String 或 SqString |
Microsoft網狀架構支援
在 Microsoft Fabric 中,目前您無法使用 datetimeoffset 數據類型建立數據行,但您可以使用 datetimeoffset 搭配 AT TIME ZONE (Transact-SQL) 函式來轉換數據,例如:
SELECT
CAST(CAST('2024-07-03 00:00:00' AS DATETIMEOFFSET) AT TIME ZONE 'Pacific Standard Time' AS datetime2) AS PST
在 Microsoft Fabric SQL 資料庫中:可以使用 7 位數的有效位數,但 Fabric OneLake 中的鏡像數據會具有時區和第七次修剪小數點。 這個數據行類型不能當做 Fabric SQL 資料庫中數據表的主鍵使用。
轉換日期和時間數據
當您轉換成日期和時間數據類型時,SQL Server 會拒絕無法辨識為日期或時間的所有值。 如需搭配日期和時間數據使用 CAST
和 CONVERT
函式的相關信息,請參閱 CAST 和 CONVERT。
轉換成 datetimeoffset 數據類型
本節提供從數據類型更新數據的範例,而不需要位移至新的 datetimeoffset 數據類型數據行。
首先,從 系統目錄檢視sys.time_zone_info 確認時區名稱。
SELECT * FROM sys.time_zone_info WHERE name = 'Pacific Standard Time';
下列範例使用 AT TIME ZONE 語法兩次。 範例程式代碼會建立數據表 dbo.Audit
、新增跨越多個日光節約時間變更的數據,並新增新的 datetimeoffset 數據行。 我們假設數據 AuditCreated
行是 *datetime2 數據類型,不含位移,並使用 UTC 時區撰寫。
在語句中UPDATE
AT TIME ZONE
,語法會先將 UTC 時區位移新增至現有的AuditCreated
數據行數據,然後將數據從 UTC Pacific Standard Time
轉換成 ,以正確調整過去日光節約時間範圍內的每個過去日光節約時間範圍的歷史數據 美國。
CREATE TABLE dbo.Audit (AuditCreated DATETIME2(0) NOT NULL);
GO
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('1/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('5/1/2024 12:00:00');
INSERT INTO dbo.Audit (AuditCreated)
VALUES ('12/1/2024 12:00:00');
GO
ALTER TABLE dbo.Audit
ADD AuditCreatedOffset DATETIMEOFFSET(0) NULL;
GO
DECLARE @TimeZone VARCHAR(50);
SELECT @TimeZone = [name]
FROM sys.time_zone_info
WHERE [name] = 'Pacific Standard Time';
UPDATE dbo.Audit
SET AuditCreatedOffset = AuditCreated
AT TIME ZONE 'UTC' AT TIME ZONE @TimeZone
WHERE AuditCreatedOffset IS NULL;
GO
SELECT *
FROM dbo.Audit;
結果集如下所示。
AuditCreated AuditCreatedOffset
------------------- --------------------------
2024-01-01 12:00:00 2024-01-01 04:00:00 -08:00
2024-05-01 12:00:00 2024-05-01 05:00:00 -07:00
2024-12-01 12:00:00 2024-12-01 04:00:00 -08:00
將 datetimeoffset 資料類型轉換為其他日期和時間類型
本節說明當 datetimeoffset 資料類型轉換成其他日期和時間資料類型時,可能發生的狀況。
當您轉換成 日期時,會複製年份、月和日。 下列程式代碼顯示將 datetimeoffset(4) 值轉換成日期值的結果。
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10 +01:00';
DECLARE @date DATE = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @date AS 'date';
結果集如下所示。
@datetimeoffset date
------------------------------ ----------
2025-12-10 12:32:10.0000 +01:0 2025-12-10
如果轉換是 time(n),則會複製小時、分鐘、秒和小數秒。 時區值則會被截斷。 當 datetimeoffset(n) 值的精確度大於 time(n) 值的精確度時,值會四捨五入。 下列程式代碼顯示將 datetimeoffset(4) 值轉換成 time(3) 值的結果。
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @time TIME(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @time AS 'time';
結果集如下所示。
@datetimeoffset time
------------------------------- ------------
2025-12-10 12:32:10.1237 +01:00 12:32:10.124
當您轉換成 datetime 時,會複製日期和時間值,並截斷時區。 當 datetimeoffset(n) 值的分數有效位數大於三位數時,就會截斷該值。 下列程式代碼顯示將 datetimeoffset(4) 值轉換成 datetime 值的結果。
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '12-10-25 12:32:10.1237 +01:0';
DECLARE @datetime DATETIME = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset ', @datetime AS 'datetime';
結果集如下所示。
@datetimeoffset datetime
------------------------------ -----------------------
2025-12-10 12:32:10.1237 +01:0 2025-12-10 12:32:10.123
當轉換成 smalldatetime 時,會複製日期和小時。 分鐘會根據秒值四捨五入,而秒會設定為 0。 下列程式代碼顯示將 datetimeoffset(3) 值轉換成 smalldatetime 值的結果。
DECLARE @datetimeoffset DATETIMEOFFSET(3) = '1912-10-25 12:24:32 +10:0';
DECLARE @smalldatetime SMALLDATETIME = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @smalldatetime AS '@smalldatetime';
結果集如下所示。
@datetimeoffset @smalldatetime
------------------------------ -----------------------
1912-10-25 12:24:32.000 +10:00 1912-10-25 12:25:00
如果轉換為 datetime2(n),則會將日期和時間複製到 datetime2 值,並截斷時區。 當 datetime2(n) 值的精確度大於 datetimeoffset(n) 值的精確度時,小數秒會截斷以符合。 下列程式代碼顯示將 datetimeoffset(4) 值轉換成 datetime2(3) 值的結果。
DECLARE @datetimeoffset DATETIMEOFFSET(4) = '1912-10-25 12:24:32.1277 +10:0';
DECLARE @datetime2 DATETIME2(3) = @datetimeoffset;
SELECT @datetimeoffset AS '@datetimeoffset', @datetime2 AS '@datetime2';
結果集如下所示。
@datetimeoffset @datetime2
---------------------------------- ----------------------
1912-10-25 12:24:32.1277 +10:00 1912-10-25 12:24:32.12
將字串常值轉換為 datetimeoffset
如果整個字串皆是有效的格式,即可從字串常值轉換為日期與時間類型。 否則,就會引發執行階段錯誤。 不指定樣式的隱含轉換或明確轉換,從日期和時間類型到字串常值都是目前會話的預設格式。 下表是字串常值轉換為 datetimeoffset 資料類型的規則。
輸入字串常值 | datetimeoffset(n) |
---|---|
ODBC DATE |
ODBC 字串常值會對應到 datetime 資料類型。 從ODBC DATETIME 常值到 datetimeoffset 類型的任何指派作業都會在 datetime 和此類型之間產生隱含轉換,如轉換規則所定義。 |
ODBC TIME |
請參閱上一個 ODBC DATE 規則 |
ODBC DATETIME |
請參閱上一個 ODBC DATE 規則 |
僅限 DATE |
元件 TIME 預設為 00:00:00 。 預設值 TIMEZONE 為 +00:00 |
僅限 TIME |
元件 DATE 預設為 1900-1-1 。 預設值 TIMEZONE 為 +00:00 |
僅限 TIMEZONE |
提供預設值 |
DATE + TIME |
預設值 TIMEZONE 為 +00:00 |
DATE + TIMEZONE |
不允許 |
TIME + TIMEZONE |
DATE 元件預設為 1900-1-1 |
DATE + TIME + TIMEZONE |
一般 |