【问题标题】:SQL - Function to get next due date (or past due date)SQL - 获取下一个截止日期(或过期日期)的函数
【发布时间】:2012-04-07 01:43:13
【问题描述】:

我已经阅读了几篇关于 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 周安排一次导入 第二条记录将是每个月的 1 日(如果他们选择 31 日可能会出现问题,尚未解决)。

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

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

我查看了日历表 as described here.

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

非常感谢任何帮助。

谢谢, 托尼

【问题讨论】:

  • 感谢山姆的编辑。看起来好多了。
  • 您最好提供一些插图示例数据和预期结果,以便大家轻松理解并找到更好的解决方案。
  • Thit,请参见表格后第三段的说明和预期结果。谢谢。
  • 我认为您需要传入开始日期以及其他参数 - 因为正如您所说,上次导入日期可能不在正确的边界日期。
  • 进口可以提前吗?如果是这样,你怎么能说3/22/2012 对于3/28 来说并不早,而不是对于3/14 来说晚了

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


【解决方案1】:

编辑(允许延迟导入):假设您的日程表有一个 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)

【讨论】:

  • 不幸的是,事情没那么简单。 lastImportDate 可能与最后到期日不匹配。可能晚了 3 天,早了 2 天,等等......
  • @Mark Ba​​nnister:有趣……我从没想过这样做。我会根据我的架构调整它,看看我得到了什么,然后告诉你。谢谢。
  • 满足我给定要求的绝佳解决方案。谢谢你。标记为答案。然而,Conrad Frix 提到了我必须解决的一个场景; “如果他们提前 3 天上传怎么办......我当前的解决方案仍会将当前的截止日期(4 天后)显示为逾期。我想我有一个想法。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 2012-12-11
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 1970-01-01
相关资源
最近更新 更多