datetimeoffset (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

定義以 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 到 31.12.99

公元 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.nnnnnnn {+|-}hh:mm)
有效位數,小數位數 請參閱下表。
儲存體大小 10 個位元組 (固定) 是預設值,而且具有 100ns 小數秒數有效位數的預設值。
精確度 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)time (Transact-SQL)

ISO 8601 描述
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm] 這兩種格式不受 SET LANGUAGE 和 SET DATEFORMAT 工作階段地區設定的影響。 datetimeoffsetdatetime 部分之間不允許有空格。
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。

時區位移

時區位移指定 timedatetime 值從 UTC 算起的時區位移。 時區位移可表示成 [+|-] hh:mm:

  • hh 是代表時區位移中時數的兩位數,範圍介於 00 至 14 之間。
  • mm 是代表時區位移中額外分鐘數的兩位數,範圍介於 00 至 59 之間。
  • + (加號) 或 - (減號) 是時區時差的必要符號。 這會指出若要取得當地時間,則必須在 UTC 時間中加上或扣除時區位移。 時區位移的有效範圍介於 -14:00 至 +14:00 之間。

時區位移範圍會遵循 XSD 結構描述定義的 W3C XML 標準,而且稍微與 SQL 2003 標準定義 (12:59 至 +14:00) 不同。

選擇性的類型參數「毫秒精確度」會指定秒鐘小數部分的位數。 這個值可以是介於 0 至 7 (100 奈秒) 之間的整數。 預設的「毫秒精確度」為 100 奈秒 (秒鐘小數部分有七位數)。

這項資料會儲存於資料庫中,而且在伺服器中進行處理、比較、儲存和索引 (如同 UTC)。 時區位移將保留在資料庫中以便日後擷取。

指定的時區位移將假設為日光節約時間 (DST) 感知並針對 DST 期間的任何指定 datetime 進行調整。

若為 datetimeoffset 類型,則 UTC 和當地 (永續或轉換的時區位移) datetime 值將在插入、更新、算數、轉換或指派作業期間進行驗證。 如果偵測到無效的 UTC 或當地 (永續或轉換的時區位移) datetime 值,將會引發無效值的錯誤。 例如,9999-12-31 10:10:00 在 UTC 中有效,但是在時區位移 +13:50 的當地時間中則會發生溢位。

若要將 date 轉換成在目標時區中對應的 datetimeoffset 值,請參閱 AT TIME ZONE (Transact-SQL)

ANSI 和 ISO 8601 合規性

datetime 主題的<ANSI 和 ISO 8601 合規性>一節適用於 datetimeoffset

下層用戶端的回溯相容性

有些下層用戶端不支援 timedatedatetime2datetimeoffset 資料類型。 下表顯示上層 SQL Server 執行個體與下層用戶端之間的類型對應。

SQL Server 資料類型 傳遞至下層用戶端的預設字串常值格式 下層 ODBC 下層 OLEDB 下層 JDBC 下層 SQLCLIENT
time hh:mm:ss[.nnnnnnn] SQL_WVARCHAR 或 SQL_VARCHAR DBTYPE_WSTR 或 DBTYPE_STR Java.sql.String 字串或 SqString
date YYYY-MM-DD SQL_WVARCHAR 或 SQL_VARCHAR DBTYPE_WSTR 或 DBTYPE_STR Java.sql.String 字串或 SqString
datetime2 YYYY-MM-DD hh:mm:ss[.nnnnnnn] SQL_WVARCHAR 或 SQL_VARCHAR DBTYPE_WSTR 或 DBTYPE_STR Java.sql.String 字串或 SqString
datetimeoffset YYYY-MM-DD hh:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR 或 SQL_VARCHAR DBTYPE_WSTR 或 DBTYPE_STR Java.sql.String 字串或 SqString

轉換日期和時間資料

當您轉換成日期與時間資料類型時,SQL Server 會拒絕所有無法辨識為日期或時間的值。 如需搭配日期和時間資料使用 CAST 及 CONVERT 函數的詳細資訊,請參閱 CAST 和 CONVERT (Transact-SQL)

將 datetimeoffset 資料類型轉換成其他日期與時間類型

本節說明當 datetimeoffset 資料類型轉換成其他日期和時間資料類型時,可能發生的狀況。

當轉換成 date 時,年、月和日都會複製。 下列程式碼顯示將 datetimeoffset(4) 值轉換成 date 值的結果。

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 一般

範例

下列範例會比較將字串轉換成各種 datetime 資料類型的結果。

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
日期 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

另請參閱

CAST 和 CONVERT (Transact-SQL)
AT TIME ZONE (Transact-SQL)