分享方式:


datetime (Transact-SQL)

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

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

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

描述

屬性
語法 DATETIME
使用方式 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
時區位移範圍
項目範圍 yyyy是代表年份的四位數17539999

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

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

HH 是兩位數,範圍從 0023,代表小時。

mm 是兩位數,範圍從 0059,代表分鐘。

ss 是兩位數,範圍從 0059,代表第二個數位。

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

支援 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 的其中一個。 四部分的年份會解譯為年份。

日期格式 訂單
[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當您以字母順序指定月份時,不會套用會話設定。

字母順序
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 格式的優點是它是具有明確規格的國際標準。 此外,此格式不會受到 SET DATEFORMATSET LANGUAGE 設定的影響。

範例:

  • 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 格式類似,但不包含日期分隔符。

未分隔
yyyyMMdd HH:mm:ss[.mmm]

ODBC 格式

ODBC API 定義了逸出序列來代表日期和時間值,供 ODBC 呼叫時間戳記資料。 由 Microsoft OLE DB provider for SQL Server 所支援的 OLE DB 語言定義 (DBGUID-SQL) 也支援 ODBC 時間戳記格式。 使用 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 值會四捨五入為 、 .003.007 秒的.000增量,如下列範例所示。

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 標準。

轉換日期和時間數據

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

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

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

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

DECLARE @date DATE = '12-21-16';
DECLARE @datetime 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 DATE = '12-21-16';

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

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

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

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

從 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';

以下為結果集。

@datetime                @time
------------------------ --------------
1900-01-01 12:10:05.123  12:10:05.1237

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

DECLARE @smalldatetime SMALLDATETIME = '12-01-16 12:32';
DECLARE @datetime 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 值的分數有效位數大於三位數時,就會截斷該值。 下列範例顯示將 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';

以下為結果集。

@datetime                @datetimeoffset
------------------------ -------------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237 +10:0

從 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';

以下為結果集。

@datetime                @datetime2
------------------------ -------------------------
1968-10-23 12:45:37.123  1968-10-23 12:45:37.1237

範例

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

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';

以下為結果集。

資料類型 輸出
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