【问题标题】:In SQL adding two days & the outcome date must be a working day在 SQL 中添加两天 & 结果日期必须是工作日
【发布时间】:2019-05-05 12:34:06
【问题描述】:

我有一个日历表,其中包含几个字段,其中下面的字段很有用,我想在表中添加一个具有以下逻辑的新列“承诺日期”。我正在为此苦苦挣扎,需要帮助。

示例:开始日期 = '01-02-2019',然后添加两天。结果应该是一个工作日。

表名 := 日期表

开始日期,IsBillingday = 1(不包括节假日和周末),WeekdayFlag = 工作日,DayNameOfWeekShort = 'Mon'....Friday。

首先开始思考简单...

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Tue' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Wed' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Thu' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 4 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Fri' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 5 , dbo.DateTable.StartDate) , 23) ELSE '' END

但是结果在某些情况下不是一个工作日...如何移动到下一个工作日?

对于这一行

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23)

结果不是工作日...则需要加+1天,判断是否为工作日...如果不加+1 ...如果是..结束循环。 一个

【问题讨论】:

  • 你说你有一个日历表,对吗?所以我假设该表说明了这一天是否是工作日;那么为什么不LEAD 到该行之后需要的工作日数呢?
  • 周四+4 和周五+3 应该总是带你到下周一。
  • 更好的样本数据和逻辑会有所帮助。
  • 星期四..我们应该只考虑 2 个工作日,然后我应该得到星期一。星期五……我们应该考虑 2 个工作日,然后我应该到星期二。
  • FullDate IsBillingDay Weekdayflag DayName PromiseDate Comment 1/01/2018 1 Weekday Tue 3/01/2018 Plus 2 days 2/01/2018 1 Weekday Wed 8/01/2018 3/01/2018 0 Weekday周四 8/01/2018 公共假期 4/01/2018 0 工作日 周五 8/01/2018 公共假期 5/01/2018 0 周末周六 N/A 6/01/2018 0 周末周日 N/A 7/01/2018 1 个工作日星期一 9/01/2018 8/01/2018 1 个工作日星期二 9/01/2018 1 个工作日星期三 10/01/2018 1 个工作日星期四

标签: sql sql-server


【解决方案1】:

如果您希望下一个工作日至少在未来两天后,那么您可以使用窗口函数。我假设您有一个标志来标识工作日。

逻辑如下:

select c.*,
       min(case when c.isworkingday = 1 then c.date end) over
           (order by c.date
            rows between 2 following and unbounded following)
           ) as next_workingday_plus_2
from calendar c;

请注意,您应该将日期存储为 日期 而不是字符串,尤其是在日历表中(除非您有一个或多个列具有特定格式的日期)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多