我在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.
但是,如果解决方案在那里,我不确定它到底是什么。我觉得非常接近解决方案,但还没有得到它。
非常感谢任何帮助。
谢谢, 贝
答案 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)