日期 (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 LANGUAGESET 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):

  • hh:mm 表示時區時差。 hh 表示時區時差中的兩位數時數,範圍介於 0 至 14 之間。

  • MM 是代表時區位移中額外分鐘數的兩位數,範圍介於 0 至 59 之間。

  • + (加號) 或 – (減號) 是時區位移的必要符號。 這會指出若要取得當地時間,則必須在國際標準時間 (UTC) 中加上或扣除時區位移。 時區位移的有效範圍介於 -14:00 至 +14:00 之間。

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 值的結果。

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

當 date 值在 smalldatetime 範圍內時,將會複製日期元件,而時間元件會設定為 00:00:00。 當 date 值在 smalldatetime 值的範圍以外時,將會引發錯誤訊息 242:「將 date 資料類型轉換成 smalldatetime 資料類型時,產生超出範圍的值」,而 smalldatetime 值會設定為 NULL。

下列程式碼顯示將 date 值轉換成 smalldatetime 值的結果。

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

將會複製日期,並將時間設定為 00:00.0000000 +00:00。

下列程式碼顯示將 date 值轉換成 datetimeoffset(3) 值的結果。

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

日期元件會複製,而時間元件會設定為 00:00:00.00,不論值是否為 (n) 皆然。

下列程式碼顯示將 date 值轉換成 datetime2(3) 值的結果。

DECLARE @date date = '1912-10-25';
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.00
--
--(1 row(s) affected)

將日期轉換成其他日期與時間類型

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

資料類型要轉換成

轉換詳細資料

time(n)

轉換失敗,而且引發了錯誤訊息 206:「運算元類型衝突: date 與 time 不相容」。

datetime

將會複製日期。 下列程式碼顯示將 date 值轉換成 datetime 值的結果。

DECLARE @date date= '12-10-25';
DECLARE @datetime datetime= @date;
SELECT @date AS '@date', @datetime AS '@datetime';
--Result
--@date      @datetime
------------ -----------------------
--2025-12-10 2025-12-10 00:00:00.000
--
--(1 row(s) affected)

smalldatetime

當 date 值在 smalldatetime 範圍內時,將會複製日期元件,而時間元件會設定為 00:00:00.000。 當 date 值在 smalldatetime 值的範圍以外時,將會引發錯誤訊息 242:「將 date 資料類型轉換成 smalldatetime 資料類型時,產生超出範圍的值」,而 smalldatetime 值會設定為 NULL。

下列程式碼顯示將 date 值轉換成 smalldatetime 值的結果。

DECLARE @date date= '1912-10-25';
DECLARE @smalldatetime smalldatetime = @date;
SELECT @date AS '@date', @smalldatetime AS '@smalldatetime';
--Result
--@date      @smalldatetime
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00
--
--(1 row(s) affected)

datetimeoffset(n)

將會複製日期,並將時間設定為 00:00.0000000 +00:00。

下列程式碼顯示將 date 值轉換成 datetimeoffset(3) 值的結果。

DECLARE @date date = '1912-10-25';
DECLARE @datetimeoffset datetimeoffset(3) = @date;
SELECT @date AS '@date', @datetimeoffset AS '@datetimeoffset';
--Result
--@date      @datetimeoffset
------------ ------------------------------
--1912-10-25 1912-10-25 00:00:00.000 +00:00
--
--(1 row(s) affected)

datetime2(n)

將會複製日期元件,並將時間元件設定為 00:00.000000。

下列程式碼顯示將 date 值轉換成 datetime2(3) 值的結果。

DECLARE @date date = '1912-10-25'
DECLARE @datetime2 datetime2(3) = @date;
SELECT @date AS '@date', @datetime2 AS '@datetime2(3)';
--Result
--@date      @datetime2(3)
------------ -----------------------
--1912-10-25 1912-10-25 00:00:00.000
--
--(1 row(s) affected)

將字串常值轉換為日期

如果整個字串皆是有效的格式,即可從字串常值轉換為日期與時間類型。 否則,就會引發執行階段錯誤。 從日期與時間類型轉換為字串常值的明確轉換不會指定樣式的隱含轉換,一律會採用目前工作階段的預設格式。 下表是字串常值轉換為 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

請參閱

參考

CAST 和 CONVERT (Transact-SQL)