使用 DATEDIFF 获取最近六个月的结果

Get result of last six months using DATEDIFF

我正在尝试在 SQL 中创建一个查询,以根据日期检索行。

我想使用 DATEDIFF() 函数(而不是其他函数)获取过去 6 个月的结果,但我的查询仍然 returns 行大于 GETUTCDATE()

我使用的查询是:

SELECT * FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180 

为什么我得到的结果仍然大于 GETUTCDATE()

  • 试试这个:

    WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) >= 0 AND DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180

  • 或:

    WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;

只要第三个参数比第二个参数

DATEDIFFreturn就是一个正数。在您的情况下,您需要保修在 6 个月内过期的记录。一个极端是 180 天,另一个极端是 0 天。对于 未来 到期的保修,您当前拨打 DATEDIFF 将 return 一个 号码。

要解决此问题,只需将 DATEDIFF 输出限制在 0 到 180 天之间,并且不允许负差异:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;

首先,您可能认为您想要使用 datediff,但事实上您在列上使用它(或任何其他函数,就此而言)使得 SQL 不可能服务器使用通过此列定义的任何索引 - 这可能是真正的性能损失。

其次,您获取未来日期记录的原因是,如果第一个日期晚于第二个日期,DateDiff 函数将 return 一个负数。我知道的所有负数都小于180.

更好的查询是这样的:

SELECT * 
FROM CARS
WHERE c.ExpiredWarranty <= GETUTCDATE()
-- If you want 6 months, don't bother with days...
AND c.ExpiredWarranty > DATEADD(MONTH, -6, GETUTCDATE()) 

因为如果 ExpiredWarranty > GETUTCDATE() 那么 DATEDIFF 他们之间 returns 一个肯定小于 180 的负数。

尝试:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180
  AND DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) >= 0;

或者:

SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;