所以这是一个常见问题,但我找不到真正符合我特定需求的答案。我有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-Server Management Studio。
答案 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
);