SQL服务器如何计算DATEDIFF函数?
How does SQL Server calculate DATEDIFF function?
好吧,这是一个看似显而易见的问题,但我只是没有完全理解...
我运行 一堆日期的以下代码:
SELECT
DATEDIFF(DAY, Start, [End]) AS DIFD,
DATEDIFF(WEEK, Start, [End]) AS DIFW,
DATEDIFF(Month, Start, [End]) AS DIFM,
DATEDIFF(Year, Start, [End]) AS DIFY
FROM
Datetest
这是我看到的结果:
Start End Description DIFD DIFW DIFM DIFY
2010-03-25 2011-03-25 Normal Year 365 52 12 1
2011-03-25 2012-03-25 Leap Year 366 53 12 1
2010-03-24 2011-03-25 Add 1 day 366 52 12 1
2010-03-24 2011-03-26 Add 2 day 367 52 12 1
2010-03-24 2011-03-27 3 days 368 53 12 1
2010-03-24 2011-03-28 4 days 369 53 12 1
2010-03-24 2011-03-29 5 days 370 53 12 1
2010-03-24 2011-03-30 6 days 371 53 12 1
2010-03-24 2011-03-31 7 days 372 53 12 1
所以这里唯一有意义的是日期差异。
为什么几个星期以来,它都未能识别出 366 天的闰年并将其归类为 53 周,但随后继续将第 3 条记录归类为仅 52 周,而数量相同几天?
同样,我也不懂月和年。我想从第 3 条记录开始,四舍五入到 13 个月或 2 年?
Returns the count (signed integer) of the specified datepart
boundaries crossed between the specified startdate and enddate.
这里的关键词是"boundaries"。
一周的边界取决于服务器设置(一周可以从星期日或星期一或任何其他日期开始)。参见 SET DATEFIRST
月份的边界是该月的第一天,年份的边界是一月 1 日。
例如,两者
DATEDIFF(Year, '2010-03-24', '2011-03-24')
DATEDIFF(Year, '2010-01-01', '2011-12-31')
会 return 1,因为在上述两个日期范围之间只有一个 1 月 1 日。
DATEDIFF
函数没有计算出一个精确的数字然后四舍五入。它计算跨越的边界。例如,DATEDIFF(YEAR, '2016-01-01', '2016-12-31')
实际上是 0。
好吧,这是一个看似显而易见的问题,但我只是没有完全理解...
我运行 一堆日期的以下代码:
SELECT
DATEDIFF(DAY, Start, [End]) AS DIFD,
DATEDIFF(WEEK, Start, [End]) AS DIFW,
DATEDIFF(Month, Start, [End]) AS DIFM,
DATEDIFF(Year, Start, [End]) AS DIFY
FROM
Datetest
这是我看到的结果:
Start End Description DIFD DIFW DIFM DIFY
2010-03-25 2011-03-25 Normal Year 365 52 12 1
2011-03-25 2012-03-25 Leap Year 366 53 12 1
2010-03-24 2011-03-25 Add 1 day 366 52 12 1
2010-03-24 2011-03-26 Add 2 day 367 52 12 1
2010-03-24 2011-03-27 3 days 368 53 12 1
2010-03-24 2011-03-28 4 days 369 53 12 1
2010-03-24 2011-03-29 5 days 370 53 12 1
2010-03-24 2011-03-30 6 days 371 53 12 1
2010-03-24 2011-03-31 7 days 372 53 12 1
所以这里唯一有意义的是日期差异。
为什么几个星期以来,它都未能识别出 366 天的闰年并将其归类为 53 周,但随后继续将第 3 条记录归类为仅 52 周,而数量相同几天?
同样,我也不懂月和年。我想从第 3 条记录开始,四舍五入到 13 个月或 2 年?
Returns the count (signed integer) of the specified datepart boundaries crossed between the specified startdate and enddate.
这里的关键词是"boundaries"。
一周的边界取决于服务器设置(一周可以从星期日或星期一或任何其他日期开始)。参见 SET DATEFIRST
月份的边界是该月的第一天,年份的边界是一月 1 日。
例如,两者
DATEDIFF(Year, '2010-03-24', '2011-03-24')
DATEDIFF(Year, '2010-01-01', '2011-12-31')
会 return 1,因为在上述两个日期范围之间只有一个 1 月 1 日。
DATEDIFF
函数没有计算出一个精确的数字然后四舍五入。它计算跨越的边界。例如,DATEDIFF(YEAR, '2016-01-01', '2016-12-31')
实际上是 0。