datetime2 (Transact-SQL)

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

適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。

datetime2 描述

屬性

語法

datetime2 [ (fractional seconds precision) ]

使用方式

DECLARE @MyDatetime2 datetime2(7)

CREATE TABLE Table1 ( Column1 datetime2(7) )

預設的字串常值格式

(用於下層用戶端)

YYYY-MM-DD hh:mm:ss[.小數秒數]

如需詳細資訊,請參閱下列的<下層用戶端的回溯相容性>一節。

日期範圍

0001-01-01 到 9999-12-31

西元 1 年 1 月 1 日到西元 9999 年 12 月 31 日

時間範圍

00:00:00 到 23:59:59.9999999

時區位移範圍

元素範圍

YYYY 是代表年份的四位數字,範圍介於 0001 至 9999 之間。

MM 是代表指定年份中某個月份的兩位數字,範圍介於 01 至 12 之間。

DD 是代表指定月份中某個日期的兩位數字,範圍介於 01 至 31 之間 (視月份而定)。

hh 是代表小時的兩位數字,範圍介於 00 至 23 之間。

mm 是代表分鐘的兩位數字,範圍介於 00 至 59 之間。

ss 是代表秒鐘的兩位數字,範圍介於 00 至 59 之間。

n* 是代表小數秒數的零至七位數字,範圍介於 0 至 9999999 之間。

字元長度

最小 19 個位置 (YYYY-MM-DD hh:mm:ss),最大 27 個位置 (YYYY-MM-DD hh:mm:ss.0000000)

有效位數,小數位數

0 至 7 位數,精確度為 100ns。 預設有效位數是 7 位數。

儲存體大小

6 個位元組代表有效位數小於 3,而 7 個位元組則代表有效位數是 3 和 4。 所有其他有效位數則需要 8 個位元組。

精確度

100 奈秒

預設值

1900-01-01 00:00:00

日曆

西曆

使用者自訂的有效秒數小數位數

時區位移感知和保留

日光節約感知

如需資料類型中繼資料,請參閱<sys.systypes (Transact-SQL)>或<TYPEPROPERTY (Transact-SQL)>。 有效位數和小數位數是某些日期和時間資料類型的變數。 若要取得資料行的有效位數和小數位數,請參閱<COLUMNPROPERTY (Transact-SQL)>、<COL_LENGTH (Transact-SQL)>或<sys.columns (Transact-SQL)>。

支援 datetime2 的字串常值格式

下表將列出支援 datetime2 的 ISO 8601 和 ODBC 字串常值格式。 如需 datetime2 日期和時間部分之字母、數字、未分隔和時間格式的相關資訊,請參閱<日期 (Transact-SQL)>和<時間 (Transact-SQL)>。

ISO 8601

描述

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

YYYY-MM-DDThh:mm:ss[. nnnnnnn]

此格式不受 SET LANGUAGE 和 SET DATEFORMAT 工作階段地區設定的影響。 T、冒號 (:) 和句號 (.) 會包含在字串常值中,例如 '2007-05-02T19:58:47.1234567'。

ODBC

說明

{ ts 'yyyy-mm-dd hh:mm:ss[.小數秒數]' }

ODBC API 專用:

小數點右邊的位數 (代表小數秒數) 可指定為 0 至 7 (100 奈秒)。

ANSI 和 ISO 8601 標準

datetime 的 ANSI 與 ISO 8601 標準適用於 datetime2。

下層用戶端的回溯相容性

有些下層用戶端不支援 time、date、datetime2 及 datetimeoffset 資料類型。 下表顯示在 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)>。

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

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

資料類型要轉換成

轉換詳細資料

date

年、月和日都會複製。 時間元件會設定為 00:00:00.000。

下列程式碼顯示將 date 值轉換成 datetime 值的結果。

DECLARE @date date = '12-21-05';
DECLARE @datetime datetime = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

time(n)

時間元件會複製,而日期元件會設定為 '1900-01-01'。 如果 time(n) 值的小數有效位數大於三位數,此值將會被截斷以配合其大小。

下列範例顯示將 time(4) 值轉換成 datetime 值的結果。

DECLARE @time time(4) = '12:10:05.1237';
DECLARE @datetime datetime = @time;
SELECT @datetime AS '@datetime', @time AS '@time';
--Result
--@datetime               @time
------------------------- -------------
--1900-01-01 12:10:05.123 12:10:05.1237
--
--(1 row(s) affected)

smalldatetime

將會複製時和分。 秒和小數秒數會設定為 0。

下列程式碼顯示將 smalldatetime 值轉換成 datetime 值的結果。

DECLARE @smalldatetime smalldatetime = '12-01-01 12:32';
DECLARE @datetime datetime = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

datetimeoffset(n)

日期和時間元件都會複製。 時區則會被截斷。 如果 datetimeoffset(n) 值的小數有效位數大於三位數,此值將會被截斷。

下列範例顯示將 datetimeoffset(4) 值轉換成 datetime 值的結果。

DECLARE @datetimeoffset datetimeoffset(4) = '1968-10-23 12:45:37.1234 +10:0';
DECLARE @datetime datetime = @datetimeoffset;
SELECT @datetime AS '@datetime', @datetimeoffset AS '@datetimeoffset';
--Result
--@datetime               @datetimeoffset
------------------------- ------------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237 +01:0
--
--(1 row(s) affected)

datetime2(n)

將會複製日期和時間。 如果 datetime2(n) 值的小數有效位數大於三位數,此值將會被截斷。

下列範例顯示將 datetime2(4) 值轉換成 datetime 值的結果。

DECLARE @datetime2 datetime2(4) = '1968-10-23 12:45:37.1237';
DECLARE @datetime datetime = @datetime2;
SELECT @datetime AS '@datetime', @datetime2 AS '@datetime2';
--Result
--@datetime               @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
--
--(1 row(s) affected)

將字串常值轉換為 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-1-1。

僅限 TIMEZONE

提供預設值。

DATE + TIME

一般

DATE + TIMEZONE

不允許。

TIME + TIMEZONE

DATE 部分預設為 1900-1-1。 忽略 TIMEZONE 輸入。

DATE + TIME + TIMEZONE

將使用本機 DATETIME。

範例

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

以下為結果集:

資料類型

輸出

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

請參閱

參考

CAST 和 CONVERT (Transact-SQL)