Sql server 使用DATEDIFF获取过去六个月的结果
我试图在SQL中创建一个查询,根据行的日期检索行 我希望使用DATEDIFF函数而不是其他函数获取过去6个月的结果,但我的查询仍然返回大于GETUTCDATE的行 我使用的查询是:Sql server 使用DATEDIFF获取过去六个月的结果,sql-server,datediff,Sql Server,Datediff,我试图在SQL中创建一个查询,根据行的日期检索行 我希望使用DATEDIFF函数而不是其他函数获取过去6个月的结果,但我的查询仍然返回大于GETUTCDATE的行 我使用的查询是: SELECT * FROM CARS WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180 为什么我仍然得到比GETUTCDATE更高的结果 试试这个: 其中DATEDIFFd,c.到期保修,GETUTCDATE>=0,DATEDIFFd,c.到期
SELECT * FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) < 180
为什么我仍然得到比GETUTCDATE更高的结果
试试这个:
其中DATEDIFFd,c.到期保修,GETUTCDATE>=0,DATEDIFFd,c.到期保修,GETUTCDATE<180
或:
若日期不一致,则c.保修到期,日期介于0和180之间
试试这个:
其中DATEDIFFd,c.到期保修,GETUTCDATE>=0,DATEDIFFd,c.到期保修,GETUTCDATE<180
或:
若日期不一致,则c.保修到期,日期介于0和180之间
只要第三个参数大于第二个参数,DATEDIFF就会返回一个正数。在您的情况下,您需要保修期在6个月内到期的记录。一个极端是180天,另一个极端是0天。对于将来到期的保修,您当前对DATEDIFF的呼叫将返回一个负数
要解决此问题,只需将DATEDIFF输出限制在0到180天之间,并且不允许负差异:
SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;
只要第三个参数大于第二个参数,DATEDIFF就会返回一个正数。在您的情况下,您需要保修期在6个月内到期的记录。一个极端是180天,另一个极端是0天。对于将来到期的保修,您当前对DATEDIFF的呼叫将返回一个负数
要解决此问题,只需将DATEDIFF输出限制在0到180天之间,并且不允许负差异:
SELECT *
FROM CARS
WHERE DATEDIFF(d, c.ExpiredWarranty, GETUTCDATE()) BETWEEN 0 AND 180;
首先,您可能认为您想要使用datediff,但是您在列上使用datediff或任何其他函数这一事实使得SQL Server无法使用此列定义的任何索引,而这可能是一个真正的性能损失 其次,获取未来日期记录的原因是,如果第一个日期晚于第二个日期,DateDiff函数将返回负数。我知道的所有负数都小于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())
首先,您可能认为您想要使用datediff,但是您在列上使用datediff或任何其他函数这一事实使得SQL Server无法使用此列定义的任何索引,而这可能是一个真正的性能损失 其次,获取未来日期记录的原因是,如果第一个日期晚于第二个日期,DateDiff函数将返回负数。我知道的所有负数都小于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返回一个负数,肯定小于180
尝试:
因为如果ExpiredWarranty>GETUTCDATE,则它们之间的DATEDIFF返回一个负数,肯定小于180
尝试:
您希望从最后6个月到当天,还是从月初开始?最后6个月到当天,因为如果过期保修>GETUTCDATE,则它们之间的DATEDIFF返回一个负数,肯定小于180。试试DATEDIFFd,c.Expired保修期,GETUTCDATE<180和DATEDIFFd,c.Expired保修期,GETUTCDATE>=0。您希望最后6个月到当天,还是从月初开始?最后6个月到当天,因为如果Expired保修期>GETUTCDATE,则两者之间的DATEDIFF返回一个肯定小于180的负数。在DATEDIFFd,c.Expired保修期,GETUTCDATE<180和DATEDIFFd,c.Expired保修期,GETUTCDATE>=0的位置尝试。