sql工作日假期

时间:2013-12-15 15:03:45

标签: sql sql-server

我已经看到这种函数的不同版本用于其他编码语言(Python,jQuery等)但不适用于SQL。我有一个程序需要计算的日期是从创建日期起65天,但它不能包括周末或假期。我们已经有一个功能,只能在一个日期添加工作日,但不考虑假期。我们有一个假期表,列出了所有假日日期,tblHolidayDates以及标准日期格式的HolidayDate列。

我该怎么做?我也可以考虑创建一个Calendar表,如果有人可以给我一个CREATE TABLE查询 - 它只需要日期,工作日和假日列。

下面我给出了当前的循环功能,它增加了工作日,但却没有假期。任何帮助将不胜感激!!

ALTER FUNCTION [dbo].[AddWorkDaysToDate]
(   
@fromDate       datetime,
@daysToAdd      int
)
RETURNS datetime
AS
BEGIN   
DECLARE @toDate datetime
DECLARE @daysAdded integer

-- add the days, ignoring weekends (i.e. add working days)
set @daysAdded = 1
set @toDate = @fromDate

while @daysAdded <= @daysToAdd
begin
-- add a day to the to date
set @toDate = DateAdd(day, 1, @toDate)
-- only move on a day if we've hit a week day
if (DatePart(dw, @toDate) != 1) and (DatePart(dw, @toDate) != 7)
begin
    set @daysAdded = @daysAdded + 1
end
end

RETURN @toDate

END

3 个答案:

答案 0 :(得分:3)

我几年前写了一个SQL函数来构建一个动态假日表作为表函数。链接如下:

http://www.joebooth-consulting.com/sqlServer/sqlServer.html#CalendFunc

希望它有所帮助...

您可以通过以下SQL语句访问表函数(或您自己的假期表)以确定假期数

SELECT count(*) FROM holiday_date(2013)
WHERE holiday_date BETWEEN @fromDate AND @toDate

然后使用dateAdd()将计数添加到返回的日期。

如果您可能有一个周末假期,请将以下内容添加到WHERE子句

   AND DatePart(dw, Holiday_date) != 1) and (DatePart(dw, holiday_date) != 7)

答案 1 :(得分:0)

我总是通过一个静态的日期表来实现这个目标,从过去的大约5年到将来的10年,每个日期都标有“工作日”状态,有时还需要其他标志。以前使用MS-SL服务器我会用WHILE循环快速实现这一点,我认为MySQL支持相同的语法

WHILE (condition)
BEGIN
 INSERT date
END

要创建表,请使用企业管理器UI或类似

CREATE TABLE DateTable
 (
   actual_date datetime NOT NULL,
   is_holiday bit NOT NULL
 )

答案 2 :(得分:0)

假设我们有一个包含actual_date (date)is_holiday (bit)列的DateTable,其中包含所有日期以及所有工作日的位置is_holiday = 0:

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'
) X
WHERE row = 65

这将发现2013-12-01加上65个工作日,不用假期。