日期 (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 |