【问题标题】:Join to Calendar Table - 5 Business Days加入日历表 - 5 个工作日
【发布时间】:2014-03-07 15:19:43
【问题描述】:

所以这是一个常见的问题,但我还没有找到真正适合我特定需求的答案。我有 2 张桌子。一个有一个 ProjectClosedDates 列表。另一个表是一个日历表,它像 2025 一样经过,其中包含行日期是否为周末的列,另一列表示假日的日期。

我的最终目标是根据 ProjectClosedDate 找出该日期后 5 个工作日的日期。我的想法是我将使用日历表并将其连接到自身,这样我就可以在距离行日期 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。

【问题讨论】:

    标签: sql calendar


    【解决方案1】:

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

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

    数据看起来像这样:

    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
      );
    

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2015-09-28
      • 2018-10-12
      • 1970-01-01
      • 2021-12-18
      • 2016-01-08
      相关资源
      最近更新 更多