適用於: SQL Server Azure SQL Database Azure SQL 受控實例 Azure Synapse Analytics 分析平台系統 (PDW) Microsoft Fabric 中的 SQL 分析端點 Microsoft Fabric 中的倉儲 Microsoft Fabric Preview 中的 SQL 資料庫

定義日期,並結合了 24 小時制的時間。 datetime2 可視為現有 datetime 類型的延伸,因其具有較大的日期範圍、較大的預設小數有效位數和選擇性的使用者指定有效位數。

datetime2 description

Property Value yyyy 是四位數的數字,範圍從 0001 9999 ,代表一年。

MM 是兩位數的數字,範圍從 01 12 ,代表指定年份中的月份。

dd 是兩位數的數字,範圍 01 從 到 31 ,視月份而定,代表指定月份的一天。

HH 是兩位數的數字,範圍從 00 23 ,代表小時。

mm 是兩位數的數字,範圍從 00 59 ,代表分鐘。

ss 是兩位數的數字,範圍從 00 59 ,代表第二個數位。

n* 是從 0 9999999 的零到七位數數位,代表小數秒。 在 Informatica 中,當 n 3 ,小數秒會截斷。 Character length 最低 19 個位置 ( yyyy-MM-dd HH:mm:ss ) 至 27 個最大值 ( yyyy-MM-dd HH:mm:ss.0000000 ) Precision, scale 0 到 7 位數,精確度為 100 奈秒(100 ns)。 預設有效位數是 7 位數。

在 Microsoft Fabric 數據倉儲中,此精確度可以是 0 到 6 的整數,沒有預設值。 必須在 Microsoft網狀架構數據倉儲中指定有效位數。 儲存體大小 1 不到 3 個有效位數為 6 個位元組。
3 或4 個有效位數為 7 個位元組。

所有其他有效位數都需要8個字節。 Accuracy 100 nanoseconds Default value 1900-01-01 00:00:00 Calendar Gregorian 使用者自訂的小數秒數有效位數 時區位移感知和保留 日光節約感知 1 所提供值適用於未壓縮的資料列存放區。 使用數據壓縮 資料行存放區 可能會改變每個精確度的記憶體大小。 此外,磁碟和記憶體中的記憶體大小可能會有所不同。 例如,使用批次模式時, datetime2 值在記憶體中一律需要 8 個位元組。

2 當 datetime2 值轉換成 varbinary 值時 ,會將額外的位元組新增至 varbinary 值以儲存有效位數。

如需數據類型元數據,請參閱 sys.systypes TYPEPROPERTY 。 有效位數和小數位數是某些日期和時間資料類型的變數。 若要取得數據行的有效位數和小數字數,請參閱 COLUMNPROPERTY COL_LENGTH sys.columns

datetime2 支援的字串常值格式

下表列出 datetime2 支援的 ISO 8601 及 ODBC 字串常值格式。 如需 datetime2 日期和時間部分 的字母、數值、未分隔及時間格式的相關信息,請參閱 日期和時間。

ISO 8601 Descriptions yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+|-]hh:mm SQL_WVARCHAR 或 SQL_VARCHAR DBTYPE_WSTRor DBTYPE_STR Java.sql.String 字串或 SqString

轉換日期和時間數據

當您轉換成日期和時間數據類型時,資料庫引擎 會拒絕無法辨識為日期或時間的所有值。 如需搭配日期和時間數據使用 CAST 和 CONVERT 函式的相關信息,請參閱 CAST 和 CONVERT

將其他日期和時間類型轉換為 datetime2 資料類型

本節描述當其他日期與時間資料類型轉換成 datetime2 資料類型時,可能發生的狀況。

date 轉換時,年、月、日都會複製。 時間元件會設定為 00:00:00.0000000。 下列程式碼顯示將 date 值轉換成 datetime2 值的結果。

DECLARE @date AS DATE = '12-21-16';
DECLARE @datetime2 AS DATETIME2 = @date;
SELECT @datetime2 AS '@datetime2',
       @date AS '@date';

結果集如下所示。

@datetime2                  @date
--------------------------- ----------
2016-12-21 00:00:00.0000000 2016-12-21

從 time(n)轉換時,會複製時間元件,並將日期元件設定為 1900-01-01。 下列範例顯示將 time(7) 值轉換成 datetime2的結果。

DECLARE @time AS TIME (7) = '12:10:16.1234567';
DECLARE @datetime2 AS DATETIME2 = @time;
SELECT @datetime2 AS '@datetime2',
       @time AS '@time';

結果集如下所示。

@datetime2                  @time
--------------------------- ----------------
1900-01-01 12:10:16.1234567 12:10:16.1234567

smalldatetime 轉換時,會複製小時和分鐘。 秒和小數秒數會設定為 0。 下列程式碼顯示將 smalldatetime 值轉換成 datetime2 值的結果。

DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime2 AS DATETIME2 = @smalldatetime;
SELECT @datetime2 AS '@datetime2',
       @smalldatetime AS '@smalldatetime';

結果集如下所示。

@datetime2                  @smalldatetime
--------------------------- -----------------------
2016-12-01 12:32:00.0000000 2016-12-01 12:32:00

datetimeoffset(n) 轉換時,會複製日期和時間元件。 時區則會被截斷。 下列範例顯示將 datetimeoffset(7) 值轉換成 datetime2 值的結果。

DECLARE @datetimeoffset AS DATETIMEOFFSET (7) = '2016-10-23 12:45:37.1234567 +10:0';
DECLARE @datetime2 AS DATETIME2 = @datetimeoffset;
SELECT @datetime2 AS '@datetime2',
       @datetimeoffset AS '@datetimeoffset';

結果集如下所示。

@datetime2                  @datetimeoffset
--------------------------- ----------------------------------
2016-10-23 12:45:37.1234567 2016-10-23 12:45:37.1234567 +10:00

當轉換來自 datetime,會複製日期和時間。 小數有效位數會延伸至 7 位數。 下列範例顯示將 datetime 值轉換成 datetime2 值的結果。

DECLARE @datetime AS DATETIME = '2016-10-23 12:45:37.333';
DECLARE @datetime2 AS DATETIME2 = @datetime;
SELECT @datetime2 AS '@datetime2',
       @datetime AS '@datetime';

結果集如下所示。

@datetime2                  @datetime
----------------------- ---------------------------
2016-10-23 12:45:37.3333333 2016-10-23 12:45:37.333

使用 datetime 時明確轉換成 datetime2

在資料庫相容性層級 130 和更新版本下,從 datetimedatetime2 數據類型的隱含轉換會藉由考慮小數毫秒來提升精確度,進而產生不同的轉換值,如上一個範例所示。 每當 datetime 與 datetime2 數據類型之間存在混合比較案例時,請使用明確轉換成 datetime2數據類型。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 資料庫 處理某些數據類型和罕見作業的改善。

將字串常值轉換為 datetime2

如果整個字串皆是有效的格式,即可從字串常值轉換為日期與時間類型。 否則,就會引發執行階段錯誤。 不指定樣式的隱含轉換或明確轉換,從日期和時間類型到字串常值都是目前會話的預設格式。 下表是字串常值轉換為 datetime2 資料類型的規則。

輸入字串常值 datetime2(n) ODBC DATE ODBC 字串常值會對應到 datetime 資料類型。 從ODBC DATETIME常值到 datetime2 類型的任何指派作業都會在 datetime 和這個類型之間產生隱含轉換,如轉換規則所定義。 ODBC TIME 請參閱上一個 ODBC DATE 規則。 ODBC DATETIME 請參閱上一個 ODBC DATE 規則。 僅限 DATE 元件 TIME 預設為 00:00:00。 僅限 TIME 元件 DATE 預設為 1900-01-01。 僅限 TIMEZONE 提供預設值。 DATE + TIME Trivial. DATE + TIMEZONE Not allowed. TIME + TIMEZONE 元件 DATE 預設為 1900-1-1。 TIMEZONE 會忽略輸入。 DATE + TIME + TIMEZONE 使用本機 DATETIME

Examples

下列範例會比較將字串轉換成各種 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';

結果集如下所示。

Data type Output