Sql server 使用DATEDIFF获取过去六个月的结果

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.到期

我试图在SQL中创建一个查询,根据行的日期检索行

我希望使用DATEDIFF函数而不是其他函数获取过去6个月的结果,但我的查询仍然返回大于GETUTCDATE的行

我使用的查询是:

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的位置尝试。