【问题标题】:SQL Server - Get Last Business Data excluding holidays and WeekendsSQL Server - 获取最后的业务数据,不包括假期和周末
【发布时间】:2017-04-20 12:51:42
【问题描述】:

我使用此查询来获取不包括周末的最后营业日期:

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

注意:不必考虑当假期在星期日,那么星期一将被视为休息。同样,无需考虑。

提前谢谢你。

【问题讨论】:

标签: sql-server


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多