使用 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;
只要第三个参数比第二个参数大,DATEDIFF
return就是一个正数。在您的情况下,您需要保修在 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;
我正在尝试在 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;
DATEDIFF
return就是一个正数。在您的情况下,您需要保修在 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;