Sql 两个日期之间的日期计算

Sql 两个日期之间的日期计算,sql,sql-server-2005,math,date,Sql,Sql Server 2005,Math,Date,我需要一些人帮我计算日期 我有一些东西从它的创建日期起每隔X天过期一次 因此,如果创建日期是4/22,并且过期天数设置为10,那么它将过期 5/2、5/12、5/22、6/1等 我需要能够告诉人们他们的物品何时会在5天内过期 因此,对于5/2,如果当前日期介于4/27和5/2之间,我需要将此项添加到计数中 这是用SQL编写的 我们只有RunDate、CreateDate和ExpirationDays 我已经做了数学计算,大致得到了截止日期,但如果它得到了一个余数,这是没有帮助的,我不想通过发布我

我需要一些人帮我计算日期

我有一些东西从它的创建日期起每隔X天过期一次

因此,如果创建日期是4/22,并且过期天数设置为10,那么它将过期

5/2、5/12、5/22、6/1等

我需要能够告诉人们他们的物品何时会在5天内过期

因此,对于5/2,如果当前日期介于4/27和5/2之间,我需要将此项添加到计数中

这是用SQL编写的

我们只有RunDate、CreateDate和ExpirationDays

我已经做了数学计算,大致得到了截止日期,但如果它得到了一个余数,这是没有帮助的,我不想通过发布我认为应该是的内容来歪曲任何人的答案。我尝试了很多方法,现在有点绝望了

任何帮助都将不胜感激

编辑:

我计算了一下,结果是这样的

CreateDate+RunDate-CreateDate/ExpireDays*RunDate-1和RunDate+5之间的ExpireDays


但这给了我SQL中的算术溢出,所以我不确定该怎么做…

在MySql中,你可以做些什么

(ExpirationDays - (DATEDIFF(NOW(), CreateDate) % ExpirationDays)) > 5;
编辑

对于SQL Server,您可以做一些不同的事情:

@expiringDays - (DATEDIFF(dd, ml.CreateDate, @date) % @expiringDays) > 5;
使用与您在更新帖子中使用的数学相似的逻辑:

With Expirations As
    (
    Select Cast('2011-04-22' As datetime) As CreateDate, 10 As ExpirationDays
    Union All
    Select DateAdd( d, ExpirationDays, CreateDate ), ExpirationDays
    From Expirations
    Where CreateDate <= DateAdd(d,10,CURRENT_TIMESTAMP) --(arbitary end date)
    )
Select *
From Expirations
Where CreateDate >= DateAdd(d, -1, CURRENT_TIMESTAMP)
    And CreateDate <= DateAdd(d, 5, CURRENT_TIMESTAMP)

标记date、calculation和expiration分别有20、5和0个跟随者。当日期函数不同时标记RDBMS更有用。所以我用mod做了这件事,它一直在咬我,但我从来没有尝试过它,它是如何给你带来问题的?所以,下面是给我带来麻烦的场景:DATEDIFFdd,ml.CreateDate,@date%@expiringDays,其中CreateDate=4/7,@date=5/10,ExpireDays=30 DateDiff=33%30=3,介于0和5之间,但在6/6之前不会再次过期,所以在6/1和6/6之间,所以我尝试了ExpireDays-DateDiffd,ml.CreateDate,@date%@expiringDays,当ExpireDays=10时,它计算为4,当它是11时,它计算为6。我这里有点不对劲,但我不确定是什么…哦,是的,我也倒过来了,如果我们用>而不是嗯。。我要试一试。我认为我所做的计算是错误的,因为当你增加mod的expired天数时,减法的左边也会增加,这就是为什么ExpireDays增加1会增加2天。。。
With Expirations As
    (
    Select Cast('2011-04-22' As datetime) As CreateDate, 10 As ExpirationDays
    Union All
    Select DateAdd( d, ExpirationDays, CreateDate ), ExpirationDays
    From Expirations
    Where CreateDate <= DateAdd(d,10,CURRENT_TIMESTAMP) --(arbitary end date)
    )
Select *
From Expirations
Where CreateDate >= DateAdd(d, -1, CURRENT_TIMESTAMP)
    And CreateDate <= DateAdd(d, 5, CURRENT_TIMESTAMP)