计算营业日,并将其与每个月的日期联系起来

时间:2013-11-27 16:23:17

标签: sql sql-server date calendar

我需要一种方法将一个月的工作日与日历生成器的特定日期联系起来。我能够正确生成日历,但无法填写工作日。

例如,如果01/01/1999是星期六,则第一个工作日是01/04/1999,下一个工作日是01/05/1999。所以我的桌子需要看起来像这样

Date                Business Date        BusinessDay    BusinessDaysRemaining
01/01/1999          01/04/1999               1                 19  
01/02/1999          01/04/1999               1                 19
01/03/1999          01/04/1999               1                 19
01/04/1999          01/04/1999               1                 19
01/05/1999          01/05/1999               2                 18
01/06/1999          01/06/1999               3                 17
Etc...

然后这将在下个月重新开始。在其他月份(和周末),营业日期可以追溯到周末前的周五,这只是我想要完成的一个例子。

我不知道从哪里开始,所以任何帮助都会受到赞赏。

这是在MS SQL 2008 R2中

1 个答案:

答案 0 :(得分:0)

对于这个答案,我创建了一个名为Calendar的表。主键是TheDate数据类型日期。其他字段是HolidayName(可为空的varchar),BusinessDayOfMonth tinyint默认为0,BusinessDaysRemainingInMonth tinyint默认为0.然后我输入了2013年12月的记录,其中有两个假期 - 圣诞节和节礼日。

以下是我的更新。

update Calendar
set BusinessDayOfMonth = therank
from Calendar join
(
select TheDate
, rank() over 
(partition by cast(datepart(year, thedate) as varchar) +  cast(datepart(month, thedate) 
as varchar) 
order by thedate) therank

from Calendar
where HolidayName is null
and DATEPART(dw,thedate) between 2 and 6  -- Monday to Friday
) temp on Calendar.TheDate = temp.TheDate


declare @BusinessDays as tinyint
set @BusinessDays =
(select count(1) BusinessDays
from Calendar
where BusinessDayOfMonth > 0
)

update Calendar
set BusinessDaysRemainingInMonth = @BusinessDays - BusinessDayOfMonth
where BusinessDayOfMonth > 0

在您的情况下,您当然需要一个日期范围。此外,您将不得不更新周末和假日的BusinessDaysRemainingInMonth字段。如果您需要帮助,我建议另外一个问题。