日期 (Transact-SQL)
定義 SQL Server 中的日期。
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure SQL 資料庫 (初始版本,透過目前版本)。 |
date 描述
屬性 |
值 |
---|---|
語法 |
date |
使用方式 |
DECLARE @MyDate date CREATE TABLE Table1 ( Column1 date ) |
預設的字串常值格式 (用於下層用戶端) |
YYYY-MM-DD 如需詳細資訊,請參閱下列的<下層用戶端的回溯相容性>一節。 |
範圍 |
0001-01-01 到 9999-12-31 西元 1 年 1 月 1 日 到西元 9999 年 12 月 31 日 |
元素範圍 |
YYYY 是代表年份的四位數,範圍介於 0001 至 9999 之間。 MM 是代表指定年份中某個月份的兩位數,範圍介於 01 至 12 之間。 DD 是代表指定月份中某個日期的兩位數,範圍介於 01 至 31 之間 (視月份而定)。 |
字元長度 |
10 個位置 |
有效位數,小數位數 |
10, 0 |
儲存體大小 |
3 個位元組 (固定) |
儲存體結構 |
1 個 3 位元組的整數會儲存日期。 |
精確度 |
一天 |
預設值 |
1900-01-01 這個值會用於從 time 隱含轉換成 datetime2 或 datetimeoffset 的附加日期部分。 |
日曆 |
西曆 |
使用者自訂的小數秒數有效位數 |
否 |
時區位移感知和保留 |
否 |
日光節約感知 |
否 |
支援 date 的字串常值格式
下表顯示 date 資料類型的有效字串常值格式。
數值 |
說明 |
---|---|
mdy [m]m/dd/[yy]yy [m]m-dd-[yy]yy [m]m.dd.[yy]yy myd mm/[yy]yy/dd mm-[yy]yy/dd [m]m.[yy]yy.dd dmy dd/[m]m/[yy]yy dd-[m]m-[yy]yy dd.[m]m.[yy]yy dym dd/[yy]yy/[m]m dd-[yy]yy-[m]m dd.[yy]yy.[m]m ymd [yy]yy/[m]m/dd [yy]yy-[m]m-dd [yy]yy-[m]m-dd |
[m]m、dd 和 [yy]yy 在字串中代表月、日和年,並且使用斜線 (/)、連字號 (-) 或句號 (.) 做為分隔符號。 僅支援四或兩位數年份。 請盡可能使用四位數年份。 若要從 0001 到 9999 中指定一個整數來表示截止年份,以便將兩位數年份解譯為四位數年份,請使用設定 two digit year cutoff 伺服器組態選項。 兩位數年份若小於或等於截止年份的後兩位數,表示它與截止年份同一世紀。 兩位數年份若大於截止年份的後兩位數,表示它在截止年份的前一個世紀。 例如,如果兩位數年份的截止是預設值 2049,則兩位數年份 49 就會被解譯為 2049,而兩位數年份 50 則解譯為 1950。 預設的日期格式由目前的語言設定決定。 您可以使用 SET LANGUAGE 和 SET DATEFORMAT 陳述式來變更日期格式。 ydm 格式不支援 date。 |
字母順序 |
說明 |
---|---|
mon [dd][,] yyyy mon dd[,] [yy]yy mon yyyy [dd] [dd] mon[,] yyyy dd mon[,][yy]yy dd [yy]yy mon [dd] yyyy mon yyyy mon [dd] yyyy [dd] mon |
mon 代表目前語言中指定的完整月份名稱或月份縮寫。 逗號是選擇性且會忽略大小寫。 若要避免模糊不清,請使用四位數年份。 如果漏了日的部分,就用當月第一天。 |
ISO 8601 |
描述 |
---|---|
YYYY-MM-DD YYYYMMDD |
與 SQL 標準相同。 這是定義為國際標準的唯一格式。 |
未分隔 |
說明 |
---|---|
[yy]yymmdd yyyy[mm][dd] |
您可以使用四位數、六位數或八位數指定 date 資料。 六位數或八位數字串一律會解譯成 ymd。 月和日一定是兩位數。 四位數字串則會解譯為年份。 |
ODBC |
說明 |
---|---|
{ d 'yyyy-mm-dd' } |
ODBC API 專用。 |
W3C XML 格式 |
說明 |
---|---|
yyyy-mm-ddTZD |
特別支援 XML / SOAP 使用方式。 TZD 是時區指示項 (Z 或 + hh: mm 或 -hh:mm):
|
ANSI 和 ISO 8601 標準
date 符合西曆的 ANSI SQL 標準定義:「附註 85 - Datetime 資料類型會允許採用西曆格式的日期以 0001–01–01 CE 到 9999–12–31 CE 的日期範圍儲存」。
下層用戶端所使用的預設字串常值格式,會遵循 SQL 標準格式定義 YYYY-MM-DD。 此格式與 ISO 8601 所定義的 DATE 相同。
下層用戶端的回溯相容性
有些下層用戶端不支援 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 |
字串或 SqString |
date |
YYYY-MM-DD |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
字串或 SqString |
datetime2 |
YYYY-MM-DD hh:mm:ss[. nnnnnnn] |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
字串或 SqString |
datetimeoffset |
YYYY-MM-DD hh:mm:ss[. nnnnnnn] [+|-]hh:mm |
SQL_WVARCHAR 或 SQL_VARCHAR |
DBTYPE_WSTR 或 DBTYPE_STR |
Java.sql.String |
字串或 SqString |
轉換日期和時間資料
當您轉換成日期與時間資料類型時,SQL Server 會拒絕所有無法辨識為日期或時間的值。 如需有關 CAST 及 CONVERT 函數與日期和時間資料搭配使用的詳細資訊,請參閱<CAST 和 CONVERT (Transact-SQL)>。
資料類型要轉換成 |
轉換詳細資料 |
---|---|
time(n) |
轉換失敗,而且引發了錯誤訊息 206:「運算元類型衝突:date 與 time 不相容」。 |
datetime |
日期會複製,而時間元件會設定為 00:00:00.000。 下列程式碼顯示將 date 值轉換成 datetime 值的結果。
|
smalldatetime |
當 date 值在 smalldatetime 範圍內時,將會複製日期元件,而時間元件會設定為 00:00:00。 當 date 值在 smalldatetime 值的範圍以外時,將會引發錯誤訊息 242:「將 date 資料類型轉換成 smalldatetime 資料類型時,產生超出範圍的值」,而 smalldatetime 值會設定為 NULL。 下列程式碼顯示將 date 值轉換成 smalldatetime 值的結果。
|
datetimeoffset(n) |
將會複製日期,並將時間設定為 00:00.0000000 +00:00。 下列程式碼顯示將 date 值轉換成 datetimeoffset(3) 值的結果。
|
datetime2(n) |
日期元件會複製,而時間元件會設定為 00:00:00.00,不論值是否為 (n) 皆然。 下列程式碼顯示將 date 值轉換成 datetime2(3) 值的結果。
|
將日期轉換成其他日期與時間類型
下表說明當 date 資料類型轉換成其他日期和時間資料類型時,可能發生的狀況。
資料類型要轉換成 |
轉換詳細資料 |
---|---|
time(n) |
轉換失敗,而且引發了錯誤訊息 206:「運算元類型衝突: date 與 time 不相容」。 |
datetime |
將會複製日期。 下列程式碼顯示將 date 值轉換成 datetime 值的結果。
|
smalldatetime |
當 date 值在 smalldatetime 範圍內時,將會複製日期元件,而時間元件會設定為 00:00:00.000。 當 date 值在 smalldatetime 值的範圍以外時,將會引發錯誤訊息 242:「將 date 資料類型轉換成 smalldatetime 資料類型時,產生超出範圍的值」,而 smalldatetime 值會設定為 NULL。 下列程式碼顯示將 date 值轉換成 smalldatetime 值的結果。
|
datetimeoffset(n) |
將會複製日期,並將時間設定為 00:00.0000000 +00:00。 下列程式碼顯示將 date 值轉換成 datetimeoffset(3) 值的結果。
|
datetime2(n) |
將會複製日期元件,並將時間元件設定為 00:00.000000。 下列程式碼顯示將 date 值轉換成 datetime2(3) 值的結果。
|
將字串常值轉換為日期
如果整個字串皆是有效的格式,即可從字串常值轉換為日期與時間類型。 否則,就會引發執行階段錯誤。 從日期與時間類型轉換為字串常值的明確轉換不會指定樣式的隱含轉換,一律會採用目前工作階段的預設格式。 下表是字串常值轉換為 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('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 |