DATEPART (Transact-SQL)

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

此函式會傳回整數,代表指定 date 的指定 datepart

如需所有 Transact-SQL 日期和時間資料類型與函式的概觀,請參閱日期和時間資料類型與函式 (Transact-SQL)

Transact-SQL 語法慣例

Syntax

DATEPART ( datepart , date )  

注意

若要檢視 SQL Server 2014 (12.x) 和舊版的 Transact-SQL 語法,請參閱 舊版檔

引數

datepart
date 引數的特定部分,其 DATEPART 會傳回整數。 此表格會列出所有有效的 datepart 引數。

注意

DATEPART 不會接受 datepart 引數的使用者定義變數對等項目。

datepart 縮寫
year yy, yyyy
quarter qq, q
month mm, m
dayofyear dy, y
day dd, d
week wk, ww
weekday dw
hour hh
minute mi, n
second ss, s
millisecond ms
microsecond mcs
nanosecond ns
tzoffset tz
iso_week isowkisoww

date
可解析成下列其中一個資料類型的運算式:

  • date
  • datetime
  • datetimeoffset
  • datetime2
  • smalldatetime
  • time

針對 dateDATEPART 會接受資料行運算式、運算式、字串常值或使用者定義變數。 請使用四位數年份以避免模糊不清的問題。 如需兩位數年份的資訊,請參閱設定兩位數年份的截止伺服器設定選項

傳回類型

int

傳回值

每個 datepart 及其縮寫都會傳回相同的值。

傳回值會取決於使用 SET LANGUAGE 及登入的設定 default language 伺服器設定選項而設定的語言環境,而有所不同。 如果 date 是某些格式的字串常值,傳回值就會取決於 SET DATEFORMAT。 當 date 是日期或時間資料類型的資料行運算式時,SET DATEFORMAT 並不會變更傳回值。

此表格針對陳述式 SELECT DATEPART(datepart,'2007-10-30 12:15:32.1234567 +05:10') 列出所有 datepart 引數和對應的傳回值。 date 引數具有 datetimeoffset(7) 資料類型。 nanoseconddatepart 傳回值的最後兩個位數一定是 00,而且此值具有 9 位數的小數位數:

.123456700

datepart 傳回值
year、yyyy、yy 2007
quarter、qq、q 4
month、mm、m 10
dayofyear、dy、y 303
day、dd、d 30
week、wk、ww 44
weekday、dw 3
hour、hh 12
minute、n 15
second、ss、s 32
millisecond、ms 123
microsecond、mcs 123456
nanosecond、ns 123456700
tzoffset、tz 310
iso_week、isowk、isoww 44

Week 和 weekday datepart 引數

針對 week (wkww) 或 weekday (dw) datepartDATEPART 傳回值會取決於 SET DATEFIRST 所設定的值。

任何一年的 1 月 1 日皆定義 weekdatepart 的起始數字。 例如:

DATEPART (wk, 'Jan 1, xxxx') = 1

其中 xxxx 是任何一年。

這個表格會針對每個 SET DATEFIRST 引數,顯示 '2007-04-21' 的 weekweekdaydatepart 傳回值。 2007 年 1 月 1 日是星期一。 2007 年 4 月 21 日是星期六。 針對美國英文,

SET DATEFIRST 7 -- ( Sunday )

可作為預設值。 設定 DATEFIRST 之後,請使用針對 datepart 資料表值建議的這個 SQL 陳述式:

SELECT DATEPART(week, '2007-04-21 '), DATEPART(weekday, '2007-04-21 ')

SET DATEFIRST

引數
week

傳回
weekday

傳回
1 16 6
2 17 5
3 17 4
4 17 3
5 17 2
6 17 1
7 16 7

year、month 和 day datepart 引數

針對 DATEPART (yeardate)、DATEPART (monthdate) 和 DATEPART (daydate) 所傳回的值分別與 YEARMONTHDAY 函式傳回的值相同。

iso_week datepart

ISO 8601 包含 ISO 週-日期系統 (週數的編號系統)。 每一週都與星期四所在的年份相關聯。 例如,2004 年第 1 週 (2004W01) 從 2003 年 12 月 29 日星期一到 2004 年 1 月 4 日星期日結束。 歐洲國家/地區通常會使用這種編號樣式。 非歐洲國家/地區通常不會使用。

注意:一年的最高週數可能是 52 或 53。

不同國家/地區的編號系統可能不符合 ISO 標準。 此表格顯示六種可能性:

每週的第一天 一年第一週包含 週指派兩次 使用於
星期日 1 月 1 日,

第一個星期六,

一年的第 1-7 天
美國
星期一 1 月 1 日,

第一個星期日,

一年的第 1-7 天
大部分歐洲國家 (地區) 和英國
星期一 1 月 4 日,

第一個星期四,

一年的第 4-7 天
ISO 8601、挪威和瑞典
星期一 1 月 7 日,

第一個星期一,

一年中的七天
星期三 1 月 1 日,

第一個星期二,

一年的第 1-7 天
星期六 1 月 1 日,

第一個星期五,

一年的第 1-7 天

tzoffset

DATEPART 會以分鐘數 (帶正負號) 傳回 tzoffset (tz) 值。 此陳述式會傳回 310 分鐘的時區位移:

SELECT DATEPART (tzoffset, '2007-05-10  00:00:01.1234567 +05:10');  

DATEPART 轉譯 tzoffset 值的方式如下:

  • 針對 datetimeoffset 和 datetime2,tzoffset 傳回的時間位移會以分鐘為單位,而 datetime2 的位移一律是 0 分鐘。
  • 針對可以隱含轉換成 datetimeoffsetdatetime2 的資料類型,DATEPART 會以分鐘數傳回時間位移。 例外:其他日期/時間資料類型。
  • 所有其他類型的參數都會導致錯誤。

smalldatetime date 引數

針對 smalldatetimedate 值,DATEPART 會以 00 形式傳回秒數。

針對不在 date 引數中的 datepart 所傳回的預設值

如果 date 引數的資料類型沒有指定的 datepart,只有在為 date 指定常值時,DATEPART 才會傳回該 datepart 的預設值。

例如,任何 date 資料類型的預設年-月-日都是 1900-01-01。 此陳述式具有 datepart 的日期部分引數、date 的時間引數,而且會傳回 1900, 1, 1, 1, 2

SELECT DATEPART(year, '12:10:30.123')  
    ,DATEPART(month, '12:10:30.123')  
    ,DATEPART(day, '12:10:30.123')  
    ,DATEPART(dayofyear, '12:10:30.123')  
    ,DATEPART(weekday, '12:10:30.123');  

如果 date 指定為變數或資料表資料行,而該變數或資料行的資料類型沒有指定的 datepartDATEPART 會傳回錯誤 9810。 在此範例中,變數 @t 具有 time 資料類型。 此範例會失敗,因為 DATEPART year 對 time 資料類型無效:

DECLARE @t time = '12:10:30.123';   
SELECT DATEPART(year, @t);  

小數秒數

這些陳述式顯示 DATEPART 會傳回小數秒數:

SELECT DATEPART(millisecond, '00:00:01.1234567'); -- Returns 123  
SELECT DATEPART(microsecond, '00:00:01.1234567'); -- Returns 123456  
SELECT DATEPART(nanosecond,  '00:00:01.1234567'); -- Returns 123456700  

備註

DATEPART 可用於 SELECT 清單、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。

DATEPART 會隱含地將字串常值轉換為 SQL Server 2008 (10.0.x) 或更新版本中的 datetime2 類型。 這表示,將日期當做字串傳遞時,DATENAME 不支援 YDM 格式。 您必須明確地將字串轉換為 datetimesmalldatetime 類型,才能使用 YDM 格式。

範例

此範例會傳回基底年份。 基底年份可協助日期計算。 在此範例中,日期是由數字指定。 請注意,SQL Server 會將 0 解譯為 1900 年 1 月 1 日。

SELECT DATEPART(year, 0), DATEPART(month, 0), DATEPART(day, 0);  

-- Returns: 1900    1    1 

此範例會傳回日期 12/20/1974 的日期部分。

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEPART (day,'12/20/1974') FROM dbo.DimCustomer;  

-- Returns: 20

此範例會傳回日期 12/20/1974 的年份部分。

-- Uses AdventureWorks  
  
SELECT TOP(1) DATEPART (year,'12/20/1974') FROM dbo.DimCustomer;  

-- Returns: 1974

另請參閱

CAST 和 CONVERT (Transact-SQL)DATETRUNC