共用方式為


datetime (Transact-SQL)

定義日期,並結合了以 24 小時制為基礎的當日時間和小數秒數。

[!附註]

請針對新的工作使用 time、date、datetime2 和 datetimeoffset 資料類型。 這些類型符合 SQL 標準。 它們具有方便移植的特性。 time、datetime2 和 datetimeoffset 會提供更多秒數有效位數。 datetimeoffset 可對全域部署的應用程式提供時區支援。

datetime 描述

屬性

語法

datetime

使用方式

DECLARE @MyDatetime datetime

CREATE TABLE 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

日曆

西曆 (不含年份的完整範圍)。

使用者自訂的小數秒數有效位數

時區位移感知和保留

日光節約感知

支援 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 日。 當您使用數值日期格式時,請在使用斜線 (/)、連字號 (-) 或句號 (.) 做為分隔符號的字串中指定月、日和年。 此字串必須以下列形式出現:

  • number separator number separator number [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。逗號是選擇性且會忽略大小寫。

以下是使用字母日期格式的一些指導方針:

  • 將日期和時間資料括在單引號 (') 中。 若為英文以外的語言,請使用 N'。

  • 以括號括住的字元是選擇性的。

  • 如果只指定年份的後兩位數字,這些數值小於設定 two digit year cutoff 伺服器組態選項組態選項的後兩位數字時,就與截止年份同一世紀。 數值如果大於或等於這個選項的值,就在截止年份的前一個世紀。 例如,如果兩位數年份的截止是 2050 (預設值),則 25 就會解譯為 2025,而 50 則解譯為 1950。 若要避免語意模糊,請使用四位數年份。

  • 如果漏了日的部分,就用當月第一天。

如果以字母形式指定月份,就不適用 SET DATEFORMAT 工作階段設定。

ISO 8601

說明

YYYY-MM-DDThh:mm:ss[.mmm]

YYYYMMDD[ hh:mm:ss[.mmm]]

範例:

  • 2004-05-23T14:25:10

  • 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 呼叫時間戳記資料。 由 SQL Server 的 Microsoft OLE DB 提供者所支援的 OLE DB 語言定義 (DBGUID-SQL) 也支援 ODBC 時間戳記格式。 使用 ADO、OLE DB 與 ODBC 架構 API 的應用程式都可以使用這個 ODBC 時間戳記格式來代表日期和時間值。

ODBC 時間戳記格式逸出序列的格式如下: { literal_type 'constant_value' }:

  • literal_type 會指定逸出序列的類型。 時間戳記有三個 literal_type 規範:

    • d = 只有日期

    • t = 只有時間

    • ts = 時間戳記 (時間 + 日期)

  • constant_value 是逸出序列的值。 constant_value 必須遵循下列各 literal_type 的格式。

    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-05';
DECLARE @datetime datetime = @date;
SELECT @datetime AS '@datetime', @date AS '@date';
--Result
--@datetime               @date
------------------------- ----------
--2005-12-21 00:00:00.000 2005-12-21

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
--
--(1 row(s) affected)

smalldatetime

將會複製時和分。 秒和小數秒數會設定為 0。

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

DECLARE @smalldatetime smalldatetime = '12-01-01 12:32';
DECLARE @datetime datetime = @smalldatetime;
SELECT @datetime AS '@datetime', @smalldatetime AS '@smalldatetime';
--Result
--@datetime               @smalldatetime
------------------------- -----------------------
--2001-12-01 12:32:00.000 2001-12-01 12:32:00
--
--(1 row(s) affected)

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 +01:0
--
--(1 row(s) affected)

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
--
--(1 row(s) affected)

範例

下列範例會比較將字串轉換成每個 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)