【问题标题】:How does SQL Server calculate DATEDIFF function?SQL Server 如何计算 DATEDIFF 函数?
【发布时间】:2016-05-05 04:39:27
【问题描述】:

好的,这是一个看似显而易见的问题,但我只是没有完全遵循......

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

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 周,但随后又将第三条记录归类为只有 52 周,而天数相同?

同样,我不了解月份和年份。我想从第 3 条记录开始,它会四舍五入到 13 个月或 2 年?

【问题讨论】:

  • 您是否尝试过手动计算实际日期?
  • 对于您预期用途中的这些示例来说,四舍五入可能看起来很自然,但您是否真的希望,例如,2016-03-242016-03-25 之间的年差也按照相同的逻辑为 1 年?

标签: sql sql-server tsql datediff


【解决方案1】:

DATEDIFF

返回指定日期部分的计数(有符号整数) 边界跨越了指定的开始日期和结束日期。

这里的关键词是“边界”。

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

月份的边界是一个月的第一天,年份的边界是一月 1 日。

例如,两者都

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

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

【讨论】:

    【解决方案2】:

    DATEDIFF 函数不会计算一个精确的数字然后进行四舍五入。它计算跨越的边界。例如,DATEDIFF(YEAR, '2016-01-01', '2016-12-31') 实际上是 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多