DATEDIFF (Transact-SQL)
∙ SQL Server 2008
∙ SQL Server 2005
返回指定的startdate和enddate之间所跨的指定datepart边界的计数(带符号的整数)。
Transact-SQL 语法约定
语法
复制
DATEDIFF (datepart ,startdate ,enddate )
参数
datepart
是指定所跨边界类型的startdate和enddate的一部分。下表列出了所有有效的datepart参数。用户定义的变量等效项是无效的。
datepart | 缩写 |
year | yy, yyyy |
quarter | qq, q |
month | mm, m |
dayofyear | dy, y |
day | dd, d |
week | wk, ww |
hour | hh |
minute | mi, n |
second | ss, s |
millisecond | ms |
microsecond | mcs |
nanosecond | ns |
startdate
是一个表达式,可以解析为time、date、smalldatetime、datetime、datetime2或datetimeoffset值。date可以是表达式、列表达式、用户定义的变量或字符串文字。从enddate减去startdate。
为避免不确定性,请使用四位数年份。有关两位数年份的信息,请参阅two digit year cutoff 选项。
enddate
请参阅startdate。
返回类型
int
返回值
∙ 每个datepart及其缩写都返回相同的值。
如果返回值超出int的范围(-2,147,483,648 到 +2,147,483,647),则会返回一个错误。对于millisecond,startdate与enddate之间的最大差值为 24 天 20 小时 31 分钟 23.647 秒。对于second,最大差值为 68 年。
如果为startdate和enddate都只指定了时间值,并且datepart不是时间datepart,则会返回 0。
在计算返回值时不使用startdate或endate的时区偏移量部分。
由于smalldatetime仅精确到分钟,因此将smalldatetime值用作startdate或enddate时,返回值中的秒和毫秒将始终设置为 0。
如果只为某个日期数据类型的变量指定时间值,则所缺日期部分的值将设置为默认值:1900-01-01。如果只为某个时间或日期数据类型的变量指定日期值,则所缺时间部分的值将设置为默认值:00:00:00。如果startdate和enddate中有一个只含时间部分,另一个只含日期部分,则所缺时间和日期部分将设置为各自的默认值。
如果startdate和enddate属于不同的日期数据类型,并且其中一个的时间部分或秒小数部分
精度比另一个高,则另一个的所缺部分将设置为 0。
日期部分边界
以下语句具有相同的startdate和相同的endate。这些日期是相邻的,在时间上相差 .0000001 秒。每个语句中startdate与endate之间的差跨其datepart的一个日历或时间边界。每个语句都返回 1。如果本例使用不同的年份且startdate和endate都在相同的日历周内,则week的返回值将为 0。
SELECT DATEDIFF(year, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999'
, '2006-01-01 00:00:00.0000000');
注释
DATEDIFF 可用在选择列表、WHERE、HAVING、GROUP BY 和 ORDER BY 子句中。在 SQL Server 2008 中,DATEDIFF 将字符串文字作为datetime2类型隐式转换。将 DATEDIFF 与 DATEADD 一起使用时,请避免字符串文字的隐式转换。有关详细信息,请参阅DATEADD (Transact-SQL)。
示例
以下示例使用不同类型的表达式作为startdate和enddate形参的实参。
A. 为startdate和enddate指定列
下例计算一个表的两列中的日期之间所跨越的日边界数。
复制
CREATE TABLE dbo.Duration
(
startDate datetime2
,endDate datetime2
)
INSERT INTO dbo.Duration(startDate,endDate)
VALUES('2007-05-06 12:10:09','2007-05-07 12:10:09')
SELECT DATEDIFF(day,startDate,endDate) AS 'Duration'
FROM dbo.Duration;
-- Returns: 1
B. 为startdate和enddate指定用户定义的变量
下例使用用户定义的变量作为startdate和enddate的参数。
复制
DECLARE @startdate datetime2 = '2007-05-05 12:10:09.3312722';
DECLARE @enddate datetime2 = '2007-05-04 12:10:09.3312722';
SELECT DATEDIFF(day, @startdate, @enddate);
C. 为startdate和enddate指定标量系统函数
下例使用标量系统函数作为startdate和enddate的参数。
复制
SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME());
D. 为startdate和enddate指定标量子查询和标量函数
下例使用标量子查询和标量函数作为startdate和enddate的参数。
复制
USE AdventureWorks2008R2;
GO
SELECT DATEDIFF(day,(SELECT MIN(OrderDate) FROM Sales.SalesOrderHeader),
(SELECT MAX(OrderDate) FROM Sales.SalesOrderHeader));
E. 为startdate和enddate指定常量
下例使用字符常量作为startdate和enddate的参数。
复制
SELECT DATEDIFF(day, '2007-05-07 09:53:01.0376635'
, '2007-05-08 09:53:01.0376635');
F. 为enddate指定数值表达式和标量系统函数
下例使用数值表达式(GETDATE ()+ 1)和标量系统函数GETDATE与SYSDATETIME作为enddatedatediff是字符型函数的参数。
注意 |
SYSDATETIME、SYSUTCDATETIME 和 SYSDATETIMEOFFSET 不能作为算术表达式的一部分。 |
复制
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论