SQL - 获取下一个截止日期(或截止日期)的函数

时间:2012-03-22 13:28:40

标签: sql date sql-server-2008-r2 scheduler

我在SQL中阅读了几篇关于日期和日程安排的文章,但我的问题的解决方案仍然没有找到。

我正在使用SQL Server 2008 r2。

我需要能够为用户提供下一个截止日期(即使它已经过去)。用户可以通过指定频率(每日,每周,每月),“乘数”(即每3天,每2周,每6个月等等)创建导入某些数据的计划并开始日期。

所以,我的数据看起来像这样:

Frequency | Multiplier | Start date
Weekly    | 2          | 02/15/2012
Monthly   | 1          | 03/01/2012

第一条记录将从2012年2月15日开始每2周安排一次导入 第二个记录将是每个月的第一个记录(如果他们选择了第31个,可能会出现问题,但尚未解决)。

我也有最后一个导入日期,可能会或可能没有准时。 所以,我想写一个函数,我可以传递频率(每周,每日等),乘数和最后一个导入日期,并计算下一个“到期”日期是在最后一个导入日期之后。

所以,鉴于上面的记录1(从2012年2月15日开始每两周进口一次),如果我的最后一个导入日期是3/1/2012,我需要返回2012年3月14日。显然,鉴于今天是第22天,这个日期将过期,我可以在使用此数据的任何UI中将其标记为此日期。如果我的上次导入日期是2012年3月22日,我将在2012年3月28日作为下一个截止日期返回,依此类推。 我可能需要将不同的频率(日,周,月)分解为三个函数,以简化逻辑。

我查看过日历表as described here.

但是,如果解决方案在那里,我不确定它到底是什么。我觉得非常接近解决方案,但还没有得到它。

非常感谢任何帮助。

谢谢, 贝

1 个答案:

答案 0 :(得分:2)

编辑(允许延迟导入):假设您的日程表有一个ID字段,请尝试:

;with cte as (
select 0 n, [Start date] as ScheduleDate, [Frequency], [Multiplier] 
from ScheduleTable where [ID] = @ScheduleID
union all
select n+1 n,
       case [Frequency]
            when 'Weekly' then dateadd(Week, [Multiplier], ScheduleDate)
            when 'Daily' then dateadd(Day, [Multiplier], ScheduleDate)
            when 'Yearly' then dateadd(Year, [Multiplier], ScheduleDate)
            ...
       end as ScheduleDate,
       [Frequency], 
       [Multiplier] 
from cte
where n < 32767 and ScheduleDate <= @LastImportDate)
select max(ScheduleDate) as NextDueDate from CTE
option (maxrecursion 32767)