SQL Server如何计算DATEDIFF函数?

时间:2016-01-28 00:19:54

标签: sql sql-server tsql datediff

好的,所以这是一个看似显而易见的问题,但我还没有完全关注......

我在一堆日期上运行了以下代码:

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年?

2 个答案:

答案 0 :(得分:6)

DATEDIFF

  

返回指定datepart的count(有符号整数)   边界在指定的startdate和enddate之间交叉。

这里的关键词是" boundary"。

一周的边界取决于服务器设置(周可以在周日或周一或任何其他日期开始)。见SET DATEFIRST

月份的边界是该月的第1天,多年的边界是1月1日。

例如,两者

DATEDIFF(Year, '2010-03-24', '2011-03-24')
DATEDIFF(Year, '2010-01-01', '2011-12-31')

将返回1,因为在上述两个日期范围之间只有1月1日。

答案 1 :(得分:4)

DATEDIFF函数不会计算确切的数字然后再舍入。它计算边界交叉。例如,DATEDIFF(YEAR, '2016-01-01', '2016-12-31')实际上是0。