datetime (Transact-SQL)
適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)
定義日期,並結合了以 24 小時制為基礎的當日時間和小數秒數。
注意
對新工作使用 time、date、datetime2 和 datetimeoffset 資料類型。 這些類型符合 SQL 標準。 它們具有方便移植的特性。 time、datetime2 和 datetimeoffset 提供更多秒數有效位數。 datetimeoffset 可為全域部署的應用程式提供時區支援。
描述
屬性 | 值 |
---|---|
語法 | datetime |
使用方式 | DECLARE @MyDatetime datetime 建立資料表 Table1 (Column1 datetime ) |
預設的字串常值格式 (用於下層用戶端) |
不適用 |
日期範圍 | 1753 年 1 月 1 日到 9999 年 12 月 31 日 |
時間範圍 | 00:00:00 到 23:59:59.997 |
時區位移範圍 | 無 |
元素範圍 | YYYY 是代表年份的四位數,範圍介於 1753 至 9999 之間。 MM 是代表指定年份中某個月份的兩位數,範圍介於 01 至 12 之間。 DD 是代表指定月份中某個日期的兩位數,範圍介於 01 至 31 之間 (視月份而定)。 hh 是代表小時的兩位數,範圍介於 00 至 23 之間。 mm 是代表分鐘的兩位數,範圍介於 00 至 59 之間。 ss 是代表秒鐘的兩位數,範圍介於 00 至 59 之間。 n* 是代表小數秒數的零至三位數,範圍介於 0 至 999 之間。 |
字元長度 | 最小 19 個位置,最大 23 個位置 |
儲存體大小 | 8 個位元組 |
精確度 | 四捨五入成 .000、.003 或 .007 秒的遞增。 |
預設值 | 1900-01-01 00:00:00 |
Calendar | 西曆 (包含年份的完整範圍)。 |
使用者自訂的小數秒數有效位數 | 否 |
時區位移感知和保留 | 否 |
日光節約感知 | 否 |
支援 datetime 的字串常值格式
下表列出 datetime 支援的字串常值格式。 除了 ODBC 以外,datetime 字串常值都位於單引號 (') 中,例如 'string_literaL'。 如果環境不是 us_english,字串常值就必須採用 N'string_literaL' 格式。
數值 | 描述 |
---|---|
日期格式: [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:999] 14:30[:20.9] 4am 4 PM |
您可以使用指定的數值月份來指定日期資料。 例如,5/20/97 代表 1997 年 5 月 20 日。 當您使用數值日期格式時,請在使用斜線 (/)、連字號 (-) 或句號 (.) 做為分隔符號的字串中指定月、日和年。 此字串必須以下列形式出現: 數字分隔符號數字分隔符號數字 [time] [time] 將語言設成 us_english 時,日期的預設順序是 mdy。 您可以使用 SET DATEFORMAT 陳述式來變更日期順序。 SET DATEFORMAT 陳述式的設定會影響日期值的解譯方式。 如果順序不符合設定,值就不會解譯為日期。 不符合規則的日期可能會誤解為超出範圍,或使用錯誤的值。 例如,依 DATEFORMAT 設定而定,可以將 12/10/08 解譯為六種日期之一。 四部分的年份會解譯為年份。 |
字母順序 | 描述 |
---|---|
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] |
您可以使用指定為完整月份名稱的月份來指定日期資料。 例如,April 或該月份在目前語言中指定的縮寫 Apr。逗號是選擇性且會忽略大小寫。 以下是使用字母日期格式的一些指導方針: 1) 將日期和時間資料括在單引號 (') 中。 若為英文以外的語言,請使用 N'。 2) 以括號括住的字元是選擇性的。 3) 如果只指定年份的後兩位數字,這些數值小於設定 two digit year cutoff 伺服器組態選項組態選項的後兩位數字時,就與截斷年份同一世紀。 數值如果大於或等於這個選項的值,就在截止年份的前一個世紀。 例如,如果 two digit year cutoff 是 2050 (預設值),25 就會解譯為 2025,而 50 則解譯為 1950。 若要避免模糊不清,請使用四位數年份。 4) 如果漏了日的部分,就用當月第一天。 以字母形式指定月份時,就不適用 SET DATEFORMAT 工作階段設定。 |
ISO 8601 | 描述 |
---|---|
YYYY-MM-DDThh:mm:ss[.mmm] YYYYMMDD[ hh:mm:ss[.mmm]] |
範例: 1) 2004-05-23T14:25:10 2) 2004-05-23T14:25:10.487 若要使用 ISO 8601 格式,您必須指定格式的每個項目,包括出現在格式中的 T、冒號 (:) 和句號 (.)。 括號指出秒數部分的小數是選擇性的。 時間元件會使用 24 小時制格式來指定。 T 指出 datetime 值之時間部份的開始。 使用 ISO 8601 格式的優點在於它是國際標準,而且沒有模糊不清的規格。 另外,此格式不受 SET DATEFORMAT 或 SET LANGUAGE 設定影響。 |
未分隔 | 描述 |
---|---|
YYYYMMDD hh:mm:ss[.mmm] |
ODBC | 描述 |
---|---|
{ ts '1998-05-02 01:23:56.123' } { d '1990-10-02' } { t '13:33:41' } |
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 規範: 1) d = 只有日期 2) t = 只有時間 3) ts = 時間戳記 (時間 + 日期) - 'constant_value' 是逸出序列的值。 對於各個 literal_type,constant_value 都必須遵循這些格式。 d:yyyy-mm-dd t:hh:mm:ss[.fff] ts:yyyy-mm-dd hh:mm:ss[.fff] |
datetime 小數秒數有效位數的四捨五入
datetime 值會捨入到 .000、.003 或 .007 秒的遞增,如下表所示。
使用者指定的值 | 系統預存值 |
---|---|
01/01/98 23:59:59.999 | 1998-01-02 00:00:00.000 |
01/01/98 23:59:59.995 01/01/98 23:59:59.996 01/01/98 23:59:59.997 01/01/98 23:59:59.998 |
1998-01-01 23:59:59.997 |
01/01/98 23:59:59.992 01/01/98 23:59:59.993 01/01/98 23:59:59.994 |
1998-01-01 23:59:59.993 |
01/01/98 23:59:59.990 01/01/98 23:59:59.991 |
1998-01-01 23:59:59.990 |
ANSI 和 ISO 8601 合規性
datetime 不符合 ANSI 或 ISO 8601 標準。
轉換日期和時間資料
當您轉換成日期與時間資料類型時,SQL Server 會拒絕所有無法辨識為日期或時間的值。 如需搭配日期和時間資料使用 CAST 及 CONVERT 函數的詳細資訊,請參閱 CAST 和 CONVERT (Transact-SQL)。
將其他日期與時間類型轉換成 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';
--Result
--@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';
--Result
--@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';
--Result
--@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';
--Result
--@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';
--Result
--@datetime @datetime2
------------------------- ------------------------
--1968-10-23 12:45:37.123 1968-10-23 12:45:37.1237
範例
下列範例會比較將字串轉換成各種 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 |
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應