日期 (Transact-SQL)
適用於:sql Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
Platform System (PDW)
SQL 分析端點在 Microsoft Fabric SQL 資料庫中的 Microsoft
網
狀架構倉儲中Microsoft網狀架構
定義 SQL Server 中的日期。 SQL Server 2008 (10.0.x) 引進日期 數據類型。
日期描述
屬性 | 值 |
---|---|
語法 | DATE |
使用方式 | DECLARE @MyDate DATE CREATE TABLE Table1 (Column1 DATE) |
預設的字串常值格式 (用於下層用戶端) |
yyyy-MM-dd 如需詳細資訊,請參閱 下層用戶端 的回溯相容性一節。 |
範圍 | 0001-01-01 通過 (1582-10-15 通過9999-12-31 9999-12-31 為 Informatica)西元 1 年 1 月 1 日到西元 9999 年 12 月 31 日 (在計算機科學則為西元 1582 年 10 月 15 日到西元 9999 年 12 月 31 日) |
元素範圍 | yyyy 是代表年份的9999 四位數0001 。 Informatica 將範圍1582 限制yyyy 為 9999 。MM 01 是兩位數,12 代表指定年份中的月份。dd 是兩位數 01 , 31 視月份而定,代表指定月份的一天。 |
字元長度 | 10 個位置 |
有效位數,小數位數 | 10, 0 |
儲存體大小 | 3 個位元組 (固定) |
儲存體結構 | 一個 3 位元組整數儲存 日期 |
精確度 | 一天 |
預設值 | 1900-01-01 這個值會用於從 time 隱含轉換成 datetime2 或 datetimeoffset 的附加日期部分。 |
Calendar | 西曆 |
使用者自訂的小數秒數有效位數 | 否 |
時區位移感知和保留 | 否 |
日光節約感知 | 否 |
date 支援的字串常值格式
下列清單顯示日期數據類型的有效字串常值格式。
[m]m
、 dd
和 [yy]yy
代表字串中的月份、日和年,並以斜線標記 ()、連字元 (/
) 或句號 (-
.
) 做為分隔符。
僅支援四位數或兩位數年份。 請盡可能使用四位數年份。 若要指定從 0001
到 9999
的整數,表示將兩位數年份解譯為四位數年份的截止年份,請使用 兩位數年份截止 伺服器組態選項。
針對 Informatica,yyyy
限制為 的範圍1582
。9999
兩位數年份若小於或等於截止年份的後兩位數,表示它與截止年份同一世紀。 兩位數年份若大於截止年份的後兩位數,表示它在截止年份的前一個世紀。 例如,如果兩位數年份的截止是預設值 2049
,則會將兩位數年份 49
解譯為 2049
,而兩位數年份 50
則會解譯為 1950
。
目前的語言設定會決定預設日期格式。 您可以使用 SET LANGUAGE 和 SET DATEFORMAT 陳述式來變更日期格式。
ydm
日期不支援格式。
month-day-year 的字串常值格式
SET DATEFORMAT mdy;
[m]m/dd/[yy]yy
[m]m-dd-[yy]yy
month-year-day 的字串常值格式
SET DATEFORMAT myd;
[m]m/[yy]yy/dd
[m]m-[yy]yy-dd
[m]m.[yy]yy.dd
日-月-年字串常值格式
SET DATEFORMAT dmy;
dd/[m]m/[yy]yy
dd-[m]m-[yy]yy
dd.[m]m.[yy]yy
日-年月的字串常值格式
SET DATEFORMAT dym;
dd/[yy]yy/[m]m
dd-[yy]yy-[m]m
dd.[yy]yy.[m]m
年-月-日字串常值格式
SET DATEFORMAT ymd;
[yy]yy/[m]m/dd
[yy]yy-[m]m-dd
[yy]yy-[m]m-dd
格式的字母清單
[dd] mon[,] yyyy
dd mon[,][yy]yy
dd [yy]yy mon
[dd] yyyy mon
mon [dd][,] yyyy
mon dd[,] [yy]
mon yyyy [dd]
yyyy mon [dd]
yyyy [dd] mon
mon
代表目前語言中指定的完整月份名稱或月份縮寫。 逗號是選擇性且會忽略大小寫。
若要避免模糊不清,請使用四位數年份。
如果漏了日的部分,就用當月第一天。
ISO 8601 格式清單
yyyy-MM-dd
yyyyMMdd
與 SQL 標準相同。 這是唯一定義為國際標準的格式。
格式的未分隔清單
[yy]yyMMdd
yyyy[MMdd]
您可以使用四位數、六位數或八位數指定 date 資料。 一律會將六位數或八位數位符串解譯為 ymd
。 月和日一定是兩位數。 四位數位串會解譯為年份。
ODBC 日期格式
{ d 'yyyy-MM-dd' }
ODBC API 專用。
W3C XML 日期格式
yyyy-MM-ddTZD
支援 XML/SOAP 使用方式。
TZD
是時區指示項目 (Z
或或 +hh:mm
-hh:mm
):
hh:mm
表示時區位移。hh
是兩位數,範圍從0
到14
,代表時區位移中的時數。mm
是兩位數,範圍從0
到59
,代表時區位移中額外分鐘數。+
(加號)或-
(減號)是時區位移的必要標誌。 這個符號指出,若要取得當地時間,則必須在國際標準時間 (UTC) 中新增或扣除時區位移。 時區位移的有效範圍是從-14:00
到+14:00
。
ANSI 和 ISO 8601 合規性
date 符合公曆的 ANSI SQL 標準定義:
Datetime 數據類型允許公曆格式的日期儲存在日期範圍 0001-01-01 CE 到 9999-12-31 CE。
預設字串常值格式,用於下層用戶端,符合定義為 yyyy-MM-dd
的SQL標準格式。 此格式與的 DATE
ISO 8601 定義相同。
注意
對於 Informatica,範圍限制為 1582-10-15
(1582 年 10 月 15 日 CE) 至 9999-12-31
(9999 年 12 月 31 日 CE)。
下層用戶端的回溯相容性
有些下層用戶端不支援 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 |
String 或 SqString |
date | yyyy-MM-dd |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetime2 | yyyy-MM-dd HH:mm:ss[.nnnnnnn] |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
datetimeoffset | yyyy-MM-dd HH:mm:ss[.nnnnnnn] [+ or -]hh:mm |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
String 或 SqString |
轉換日期和時間數據
當您轉換成日期與時間資料類型時,SQL Server 會拒絕所有無法辨識為日期或時間的值。 如需搭配日期和時間數據使用 CAST
和 CONVERT
函式的相關信息,請參閱 CAST 和 CONVERT。
將日期轉換為其他日期和時間類型
本節描述當 date 資料類型轉換成其他日期和時間資料類型時,可能發生的狀況。
當轉換為 time(n)時,轉換會失敗,並引發錯誤訊息 206:
操作數類型衝突:日期與時間不相容。
如果轉換為 datetime,則會複製日期元件。 下列程式代碼顯示將日期值轉換成 datetime 值的結果。
DECLARE @date AS DATE = '12-10-25';
DECLARE @datetime AS DATETIME = @date;
SELECT @date AS '@date',
@datetime AS '@datetime';
結果集如下所示。
@date @datetime
---------- -----------------------
2025-12-10 2025-12-10 00:00:00.000
當轉換為 smalldatetime 時,日期值會位於 smalldatetime 的範圍內、複製日期元件,並將時間元件設定為 00:00:00.000
。 當 date 值超出 smalldatetime 值的範圍時,就會引發錯誤訊息 242,並將 smalldatetime 值設定為 NULL
:
將日期數據類型轉換成 smalldatetime 數據類型會導致超出範圍的值。
下列程式代碼顯示將日期值轉換成 smalldatetime 值的結果。
DECLARE @date AS DATE = '1912-10-25';
DECLARE @smalldatetime AS SMALLDATETIME = @date;
SELECT @date AS '@date',
@smalldatetime AS '@smalldatetime';
結果集如下所示。
@date @smalldatetime
---------- -------------------
1912-10-25 1912-10-25 00:00:00
若要轉換成 datetimeoffset(n),則會複製日期,並將時間設定為 00:00.0000000 +00:00
。 下列程式代碼顯示將日期值轉換成 datetimeoffset(3) 值的結果。
DECLARE @date AS DATE = '1912-10-25';
DECLARE @datetimeoffset AS DATETIMEOFFSET (3) = @date;
SELECT @date AS '@date',
@datetimeoffset AS '@datetimeoffset';
結果集如下所示。
@date @datetimeoffset
---------- ------------------------------
1912-10-25 1912-10-25 00:00:00.000 +00:00
當轉換為 datetime2(n)時,會複製日期元件,並將時間元件設定為 00:00.000000
。 下列程式代碼顯示將日期值轉換成 datetime2(3) 值的結果。
DECLARE @date AS DATE = '1912-10-25';
DECLARE @datetime2 AS DATETIME2 (3) = @date;
SELECT @date AS '@date',
@datetime2 AS '@datetime2(3)';
結果集如下所示。
@date @datetime2(3)
---------- -----------------------
1912-10-25 1912-10-25 00:00:00.000
將字串常值轉換為日期
如果整個字串皆是有效的格式,即可從字串常值轉換為日期與時間類型。 否則,就會引發執行階段錯誤。 不指定樣式的隱含轉換或明確轉換,從日期和時間類型到字串常值,都是目前會話的預設格式。 下表是字串常值轉換為 date 資料類型的規則。
輸入字串常值 | date |
---|---|
ODBC DATE | ODBC 字串常值會對應到 datetime 資料類型。 任何將 ODBC DATETIME 常值指派成 date 類型的作業,皆會隱含轉換 datetime 與轉換規則定義的類型。 |
ODBC TIME | 請參閱先前的 ODBC DATE 規則。 |
ODBC DATETIME | 請參閱先前的 ODBC DATE 規則。 |
僅限 DATE | 一般 |
僅限 TIME | 提供預設值。 |
僅限 TIMEZONE | 提供預設值。 |
DATE + TIME | 使用輸入字串的 DATE 部分。 |
DATE + TIMEZONE | 不允許。 |
TIME + TIMEZONE | 提供預設值。 |
DATE + TIME + TIMEZONE | 使用本機 DATETIME 的 DATE 部分。 |
範例
下列範例會比較將字串轉換成各種 date 和 time 資料類型的結果。
SELECT CAST ('2022-05-08 12:35:29.1234567 +12:15' AS TIME (7)) AS 'time',
CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATE) AS 'date',
CAST ('2022-05-08 12:35:29.123' AS SMALLDATETIME) AS 'smalldatetime',
CAST ('2022-05-08 12:35:29.123' AS DATETIME) AS 'datetime',
CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIME2 (7)) AS 'datetime2',
CAST ('2022-05-08 12:35:29.1234567 +12:15' AS DATETIMEOFFSET (7)) AS 'datetimeoffset';
結果集如下所示。
資料類型 | 輸出 |
---|---|
time | 12:35:29.1234567 |
date | 2022-05-08 |
smalldatetime | 2022-05-08 12:35:00 |
datetime | 2022-05-08 12:35:29.123 |
datetime2 | 2022-05-08 12:35:29.1234567 |
datetimeoffset | 2022-05-08 12:35:29.1234567 +12:15 |