DATEPART (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

此函数返回表示指定 date 的指定 datepart 的整数 。

有关所有 Transact-SQL 日期和时间数据类型及函数的概述,请参阅日期和时间数据类型及函数 (Transact-SQL)

Transact-SQL 语法约定

语法

DATEPART ( datepart , date )  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

datepart
DATEPART 将返回表示 date 参数的特定部分的整数 。 此表列出了所有有效的 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 isowk, isoww

date
解析为下列某种数据类型的表达式:

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

对于 date,DATEPART 接受列表达式、表达式、字符串文本或用户定义的变量 。 使用四位数年份可避免含糊不清问题。 有关两位数年份的信息,请参阅配置两位数年份截止服务器配置选项

返回类型

int

返回值

每个 datepart 及其缩写都返回相同的值 。

返回值取决于 SET LANGUAGE 和登录时选择的配置默认语言服务器配置选项设定的语言环境。 如果 date 是某些格式的字符串文本,则返回值取决于 SET DATEFORMAT 。 当 date 为日期或时间数据类型的列表达式时,SET DATEFORMAT 不更改返回值。

此表列出了所有 datepart 参数以及 SELECT DATEPART(datepart,'2007-10-30 12:15:32.1234567 +05:10') 语句相应的返回值 。 date 参数具有 datetimeoffset(7) 数据类型 。 nanosecond datepart 返回值的最后两位始终为 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 (wk, ww) 或 weekday (dw) datepart,DATEPART 返回值取决于 SET DATEFIRST 设置的值 。

任何年份的 1 月 1 日都用来定义 week datepart 的起始数字。 例如:

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

其中,xxxx 为任何年份 。

下表列出了每个 SET DATEFIRST 参数的“2007-04-21”的 week 和 weekday datepart 返回值。 2007 年 1 月 1 日为星期一。 2007 年 4 月 21 日为星期六。 对于美式英语,

SET DATEFIRST 7 -- ( Sunday )

用作默认值。 设置 DATEFIRST 后,请将此建议的 SQL 语句用于 datepart 表值:

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

年、月和日日期部分参数

DATEPART (year, date)、DATEPART (month, date) 和 DATEPART (day, date) 的返回值分别与函数 YEARMONTHDAY 的返回值相同 。

iso_week datepart

ISO 8601 包括 ISO 周-日期系统,即周的编号系统。 每周都与该周内星期四所在的年份关联。 例如,2004 年的第一周 (2004W01) 包括 2003 年 12 月 29 日(星期一)到 2004 年 1 月 4 日(星期日)。 欧洲国家/地区通常使用此编号样式。 非欧洲国家/地区则通常不使用。

注意:一年中的最多周数可能是 52 或 53。

不同的国家/地区的编号系统可能不符合 ISO 标准。 此表显示六种可能情况:

每周的第一天 一年的第一周包含 分配两次的周 使用的国家/地区
星期日 1 月 1 日,

第一个星期六,

其中有 1–7 天属于此年
United States
星期一 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 分钟。
  • 对于可隐式转换为 datetimeoffset 或 datetime2 的数据类型,DATEPART 返回以分钟数表示的时间偏移量 。 异常:其他 date/time 数据类型。
  • 所有其他类型的参数都会导致错误。

smalldatetime 日期参数

对于 smalldatetime date 值,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 指定为变量或表列,并且该变量或列的数据类型没有指定的 datepart,DATEPART 将返回错误 9810。 在此示例中,变量 @t 具有 time 数据类型。 示例失败,因为日期部分年份对于 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 list、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。

在 SQL Server 2008 (10.0.x) 及更高版本中,DATEPART 将字符串文字隐式强制转换为 datetime2 类型。 这就意味着,日期在作为字符串传递时,DATENAME 不会支持 YDM 格式。 必须先将字符串显式转换为 datetime 或 smalldatetime 类型,然后才能使用 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