【问题标题】:Why am I getting different results when using the DATEDIFF function with a different specified interval?为什么在使用具有不同指定间隔的 DATEDIFF 函数时会得到不同的结果?
【发布时间】:2019-07-18 03:38:30
【问题描述】:

我使用 DATEDIFF 函数使用 YEAR 和 MONTH 间隔运行以下查询,但相应地修改查询的右侧,以便我认为它们应该相同。 dbo.logs2486512 行。

SELECT count(*) FROM dbo.logs                  
WHERE DATEDIFF(YEAR, DT, GetDate()) <= 1;

result: 595712

SELECT count(*) FROM dbo.logs                  
WHERE DATEDIFF(MONTH, DT, GetDate()) <= 12;

result: 334773

为什么我会得到如此截然不同的结果?我认为指定 12 个月将返回与 1 年相同的行数。

【问题讨论】:

  • DATEDIFF(MONTH, DT, GetDate()) 会给你月份部分
  • 请参考文档docs.microsoft.com/en-us/sql/t-sql/functions/…This function returns the count (as a signed integer value) of the specified datepart boundaries crossed between the specified startdate and enddateDATEDIFF(YEAR, DT, GetDate()) &lt;= 1 的含义,它包括 DT = 2018-01-01 直到今天。其中DATEDIFF(MONTH, DT, GetDate()) &lt;= 12 仅包括2018-08-01 直到今天

标签: sql sql-server datediff


【解决方案1】:

DATEDIFF() 并没有达到你的预期。它计算两个日期/时间之间的边界数。因此,以下两者的年份差异为“1”:

2018-12-31  and   2019-01-01
2018-01-01  and   2019-12-31

月差在 1 到 23 之间变化。

更好的方法是使用日期算术:

WHERE DT <= DATEADD(YEAR, -1, GETDATE()) 

这不仅更准确,而且还可以利用索引。

【讨论】:

    【解决方案2】:

    它只给出年份差异

    SELECT  DATEDIFF(YEAR,'2017-02-02', GetDate())  
    Result-2
    

    它只给出月差。

    SELECT  DATEDIFF(MONTH,'2019-02-02', GetDate())
    

    结果-5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-11
      • 2015-04-06
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多