SQL Server - 获取最后的业务数据,不包括假期和周末

时间:2017-04-20 04:06:11

标签: sql-server

我使用此查询来获取除周末之外的最后一个营业日期:

DECLARE @LastBizDate as DATETIME

SELECT @LastBizDate = (DATEADD(DAY, CASE DATENAME(WEEKDAY, GETDATE()) 
                      WHEN 'Saturday' THEN -1 
                      WHEN 'Sunday' THEN -2 
                      ELSE -1 END, DATEDIFF(DAY, 0, GETDATE())))

SELECT @LastBizDate AS 'Last_Business_Date'

但我怎样才能排除假期?

我有这个带有示例数据的tbl_Holidays表:

-------------------------
|Holiday_Date           |
|-----------------------|
|2017-04-14 00:00:00.000|
|2017-05-01 00:00:00.000|
|2017-10-18 00:00:00.000|
|2017-12-25 00:00:00.000|
-------------------------

注意:无需考虑假期是在星期日,那么星期一将被视为关闭。同样,不需要考虑那个。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我认为你需要一个循环才能做到这一点。

在排除星期六和星期日之后,您需要检查日期是否在假期表中。再次,您需要检查日期(从假日表中排除后计算)是在星期日和星期六。

DECLARE @last_wrk_day DATETIME
    ,@today DATETIME
DECLARE @TblHoliday AS TABLE (Holiday_Date DATE)

INSERT INTO @TblHoliday
VALUES ('2017-04-14 00:00:00.000')
    ,('2017-05-01 00:00:00.000')
    ,('2017-10-18 00:00:00.000')
    ,('2017-12-25 00:00:00.000')
    ,('2017-04-13 00:00:00.000')

SET @today = '2017-04-10 00:00:00.000' --getdate()
SET @last_wrk_day = dateadd(day, - 1, @today)

WHILE (
        (
            SELECT TOP 1 1
            FROM @TblHoliday
            WHERE Holiday_Date = @last_wrk_day
            ) = 1
        OR DATEPART(dw, @last_wrk_day) IN (1, 7)
        )
BEGIN
    SET @last_wrk_day = dateadd(day, - 1, @last_wrk_day)
END

SELECT @last_wrk_day

输出

2017-04-13 00:00:00.000