datetime(Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 資料庫

定義日期,並結合了以 24 小時制為基礎的當日時間和小數秒數。

避免使用 日期時間 進行新工作。 請改用 time、date、datetime2 和 datetimeoffset 數據類型。 這些類型與 SQL Standard 一致,而且更容易移植。 time、datetime2 和 datetimeoffset 提供更多秒數有效位數。 datetimeoffset 可為全域部署的應用程式提供時區支援。

Description

Property Value
Syntax DATETIME
Usage DECLARE @MyDatetime DATETIME;
CREATE TABLE Table1 (Column1 DATETIME);
預設字串常值格式 (用於下層用戶端) 不適用
日期範圍 1753-01-01 (1753 年 1 月 1 日) 到 9999-12-31 (9999 年 12 月 31 日)
時間範圍 00:00:00 到 23:59:59.997
時區位移範圍 None
元素範圍 yyyy是代表年份的四位數17539999。

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

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

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

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

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

n* 是零到三位數,範圍從 0 到 999,代表小數秒。
字元長度 最小 19 個位置,最大 23 個位置
儲存空間大小 8 個位元組
Accuracy 四捨五入為、 .000或 .003 秒的.007遞增
預設值 1900-01-01 00:00:00
Calendar 公曆(包括完整的年份範圍)
用戶定義的小數秒有效位數 No
時區位移感知與保留 No
日光節約感知 No

支援 datetime 的字串常值格式

下表列出 datetime 支援的字串常值格式。 除了 ODBC 之外, datetime 字串常值會以單引號 ('),例如 'string_literal'。 如果環境不是 us_english,則字串常值應為 Unicode 格式 N'string_literal'。

數值格式

您可以使用指定的數值月份來指定日期資料。 例如, 5/20/97 代表 1997 年 5 月的第二十天。 當您使用數值日期格式時,請在字串中指定月份、日和年,以使用斜線標記 ()、連字元 (/) 或句號 (-.) 做為分隔符。 此字串必須以下列形式出現:

<number separator number separator number [time] [time]>

當語言設定為 us_english時,日期的預設順序為 mdy (月、日、年)。 你可以透過帳 SET DATEFORMAT 單來更改日期順序。

的 SET DATEFORMAT 設定會決定如何解譯日期值。 如果順序不符合設定,值就不會解譯為日期。 順序錯亂的日期可能會誤譯為超出範圍或錯誤值。 例如,視設定而定, 12/10/08 可以解譯為六個日期 DATEFORMAT 的其中一個。 四部分的年份會解譯為年份。

日期格式 Order
[0]4/15/[19]96 mdy
[0]4-15-[19]96 mdy
[0]4.15.[19]96 mdy
[0]4/[19]96/15 myd
15/[0]4/[19]96 dmy
15/[19]96/[0]4 dym
[19]96/15/[0]4 ydm
[19]96/[0]4/15 ymd
時間格式
14:30
14:30[:20:997]
14:30[:20.9]
4am
4 PM

字母順序格式

您可以使用指定為完整月份名稱的月份來指定日期資料。 例如, April或以目前語言指定的月份縮寫 Apr。 逗號是選擇性且會忽略大小寫。

以下是使用字母日期格式的一些指導方針:

  • 以單引弧括住日期和時間數據(')。 對於英文以外的語言,請使用 N''。

  • 以括弧括住的字元是選擇性的。

  • 如果您只指定年份的最後兩位數,則小於兩位數年份截止組態選項值最後兩位數的值會與截止年份相同。 數值如果大於或等於這個選項的值,就在截止年份的前一個世紀。 例如,如果 兩位數年份截斷 是 2050 (預設值), 25 則會解譯為 2025 ,並 50 解譯為 1950。 若要避免模糊不清,請使用四位數年份。

  • 如果漏了日的部分,就用當月第一天。

  • SET DATEFORMAT當您以字母順序指定月份時,不會套用會話設定。

Alphabetical
Apr[il] [15][,] 1996
Apr[il] 15[,] [19]96
Apr[il] 1996 [15]
[15] Apr[il][,] 1996
15 Apr[il][,][19]96
15 [19]96 apr[il]
[15] 1996 apr[il]
1996 APR[IL] [15]
1996 [15] APR[IL]

ISO 8601 格式

若要使用 ISO 8601 格式,您必須以 格式指定每個元素,包括 T、冒號 (:) 和格式中顯示的句號 (.)。

括號指出秒數部分的小數是選擇性的。 時間元件會使用 24 小時制格式來指定。 T表示 datetime 值之時間部分的開始時間。

使用 ISO 8601 格式的優點是它是具有明確規格的國際標準。 此外,這種格式不受 OR SET DATEFORMAT 設定影響SET LANGUAGE。

Examples:

  • 2004-05-23T14:25:10
  • 2004-05-23T14:25:10.487
ISO 8601 認證
yyyy-MM-ddTHH:mm:ss[.mmm]
yyyyMMdd[ HH:mm:ss[.mmm]]

未分離格式

此格式與 ISO 8601 格式類似,但不包含日期分隔符。

Unseparated
yyyyMMdd HH:mm:ss[.mmm]

ODBC 格式

ODBC API 定義了逸出序列來代表日期和時間值,供 ODBC 呼叫時間戳記資料。 此 ODBC 時間戳格式也被 OLE DB 語言定義(DBGUID-SQL)支援,該定義由 Microsoft OLE DB 提供者支援,SQL Server 版本。 使用 ADO、OLE DB 與 ODBC 架構 API 的應用程式都可以使用這個 ODBC 時間戳記格式來代表日期和時間值。

ODBC 時間戳逸出序列格式如下: { <literal_type> '<constant_value>' }

  • <literal_type> 指定逸出序列的類型。 時間戳有三 <literal_type> 個規範:

    • d = 僅限日期
    • t = 僅限時間
    • ts = timestamp (time + date)
  • <constant_value> 是逸出序列的值。 <constant_value> 每個 都必須遵循這些格式 <literal_type>:

    • d: yyyy-MM-dd
    • t: hh:mm:ss[.fff]
    • ts: yyyy-MM-dd HH:mm:ss[.fff]
ODBC
{ ts '1998-05-02 01:23:56.123' }
{ d '1990-10-02' }
{ t '13:33:41' }

datetime 小數秒數有效位數的四捨五入

datetime 值會四捨五入為 、 .000或 .003 秒的.007增量,如下列範例所示。

SELECT '01/01/2024 23:59:59.999' AS [User-specified value],
    CAST('01/01/2024 23:59:59.999' AS DATETIME) AS [System stored value]
UNION SELECT '01/01/2024 23:59:59.998', CAST('01/01/2024 23:59:59.998' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.997', CAST('01/01/2024 23:59:59.997' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.996', CAST('01/01/2024 23:59:59.996' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.995', CAST('01/01/2024 23:59:59.995' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.994', CAST('01/01/2024 23:59:59.994' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.993', CAST('01/01/2024 23:59:59.993' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.992', CAST('01/01/2024 23:59:59.992' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.991', CAST('01/01/2024 23:59:59.991' AS DATETIME)
UNION SELECT '01/01/2024 23:59:59.990', CAST('01/01/2024 23:59:59.990' AS DATETIME);

結果集如下所示。

使用者指定值 系統預存值
01/01/2024 23:59:59.999 2024-01-02 00:00:00.000
01/01/2024 23:59:59.998
01/01/2024 23:59:59.997
01/01/2024 23:59:59.996
01/01/2024 23:59:59.995
2024-01-01 23:59:59.997
01/01/2024 23:59:59.994
01/01/2024 23:59:59.993
01/01/2024 23:59:59.992
2024-01-01 23:59:59.993
01/01/2024 23:59:59.991
01/01/2024 23:59:59.990
2024-01-01 23:59:59.990

ANSI 和 ISO 8601 合規性

datetime 不符合 ANSI 或 ISO 8601 標準。

轉換日期和時間數據

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

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

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

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

DECLARE @date AS DATE = '12-21-16';
DECLARE @datetime AS DATETIME = @date;

SELECT @datetime AS '@datetime',
       @date AS '@date';

結果集如下所示。

@datetime                @date
------------------------ -----------
2016-12-21 00:00:00.000  2016-12-21

上一個範例使用區域特定的日期格式 (MM-DD-YY)。

DECLARE @date AS DATE = '12-21-16';

您應該更新範例,以符合您區域的格式。

您也可以使用符合 ISO 8601 規範的日期格式 (yyyy-MM-dd) 來完成範例。 例如:

DECLARE @date AS DATE = '2016-12-21';
DECLARE @datetime AS DATETIME = @date;

SELECT @datetime AS '@datetime',
       @date AS '@date';

從 time(n)轉換時,會複製時間元件,並將日期元件設定為 。1900-01-01 當 time(n) 值的分數精度大於三位數時,該值會四捨五入至最接近的日期時間遞增(.000、 或 .003.007 秒)。 下列範例顯示將 TIME(4) 值轉換成 DATETIME 值的結果。

DECLARE @time AS TIME (4) = '12:10:05.0017';
DECLARE @datetime AS DATETIME = @time;

SELECT @datetime AS '@datetime',
       @time AS '@time';

結果集如下所示。

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.003  12:10:05.0017

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

DECLARE @smalldatetime AS SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime AS DATETIME = @smalldatetime;

SELECT @datetime AS '@datetime',
       @smalldatetime AS '@smalldatetime';

結果集如下所示。

@datetime                @smalldatetime
------------------------ --------------------
2016-12-01 12:32:00.000  2016-12-01 12:32:00

從 datetimeoffset(n)轉換時,會複製日期和時間元件。 時區則會被截斷。 當 datetimeoffset(n) 值的分數精度大於三位數時,該值會 四捨五入 至最接近 的 datetime 遞增數(.000, , .003或 .007 秒)。 下列範例顯示將 DATETIMEOFFSET(4) 值轉換成 DATETIME 值的結果。

DECLARE @datetimeoffset AS DATETIMEOFFSET (4) = '1968-10-23 12:45:37.0017 +10:00';
DECLARE @datetime AS DATETIME = @datetimeoffset;

SELECT @datetime AS '@datetime',
       @datetimeoffset AS '@datetimeoffset';

結果集如下所示。

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.003  1968-10-23 12:45:37.0017 +10:00

從 datetime2(n)轉換時,會複製日期和時間。 當 datetime2(n) 值的分數精度大於三位數時,該值會四捨五入至最接近的 datetime 遞增量(.000、 或 .003.007 秒)。 下列範例顯示將 DATETIME2(4) 值轉換成 DATETIME 值的結果。

DECLARE @datetime2 AS DATETIME2 (4) = '1968-10-23 12:45:37.0017';
DECLARE @datetime AS DATETIME = @datetime2;

SELECT @datetime AS '@datetime',
       @datetime2 AS '@datetime2';

結果集如下所示。

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.003  1968-10-23 12:45:37.0017

Examples

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

SELECT CAST ('2024-05-08 12:35:29.1234567 +12:15' AS TIME (7)) AS 'time',
       CAST ('2024-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
       CAST ('2024-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
       CAST ('2024-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
       CAST ('2024-05-08 12:35:29.1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
       CAST ('2024-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET (7)) AS 'datetimeoffset';

結果集如下所示。

數據類型 Output
time 12:35:29.1234567
date 2024-05-08
smalldatetime 2024-05-08 12:35:00
datetime 2024-05-08 12:35:29.123
datetime2 2024-05-08 12:35:29.1234567
datetimeoffset 2024-05-08 12:35:29.1234567 +12:15