加入日历表 - 5个工作日

时间:2014-03-07 15:19:44

标签: sql calendar

所以这是一个常见问题,但我找不到真正符合我特定需求的答案。我有2张桌子。一个有ProjectClosedDates列表。另一个表是一个日历表,如2025所示,如果行日期是周末日,则列有列,而另一列是假日日期。

我的最终目标是根据ProjectClosedDate找出该日期后5个工作日的日期。我的想法是,我将使用Calendar表并将其连接到自身,以便我可以在距离行日期5个工作日的日历表中插入一列。然后我将基于ProjectClosedDate = RowDate将Project表连接到该表。

如果我要检查一条记录的实际业务日期表,我可以使用它:

SELECT actual_date from 
(
    SELECT actual_date, ROW_NUMBER() OVER(ORDER BY actual_date) AS Row 
    FROM DateTable
    WHERE is_holiday= 0 and actual_date > '2013-12-01'
    ORDER BY actual_date
) X
WHERE row = 65

从这里开始:

sql working days holidays

但是,这只是一个日期,我需要一个基于每行的日期列。有关最佳方法的想法是什么?我正在使用SQL-Server Management Studio。

1 个答案:

答案 0 :(得分:0)

完全未经测试,未经过深思熟虑:

如果“工作日”的概念在您的系统中很常见且很重要,您可以在表格中添加“营业日序列”列。该列将是一个简单的唯一序列,每个工作日增加一个,并且每天都为null,不计算为工作日。

数据看起来像这样:

Date       BDAY_SEQ
========== ========
2014-03-03    1
2014-03-04    2
2014-03-05    3
2014-03-06    4
2014-03-07    5
2014-03-08    
2014-03-09    
2014-03-10    6

现在从任何日期找到第N个工作日是一项简单的任务。 您只需使用日历表进行自联接,在连接条件中添加偏移量。

select a.actual_date
      ,b.actual_date as nth_bussines_day
  from DateTable a
  join DateTable b on(
       b.bday_seq = a.bday_seq + 5
  );