2017-04-20 1 views
0

나는 주말을 제외한 마지막으로 비즈니스 날짜 얻기 위해이 쿼리를 사용하여 가져 오기 :SQL 서버 - 마지막 비즈니스 데이터를 제외한 휴일 및 주말

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' 

그러나이 어떻게 휴일을 제외 할 수 있습니까?

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

: 휴일이 일요일에 떨어질 때, 다음 월요일 오프 간주됩니다 것을 고려할 필요

나는 샘플 데이터이 tbl_Holidays 테이블이 있습니다. 다시 한번 생각해 볼 필요는 없습니다.

미리 감사드립니다.

+0

당신은 당신의 이전 질문 http://stackoverflow.com/questions/43492452/sql-에 내 대답을 시도 할 수 서버 - 시간 차이 - 제외 - 주말 및 공휴일 – TriV

답변

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 

OUTPUT

2017년 4월 13일 00 : 00 : 00.000

+0

고맙습니다. 그것은 작동합니다 :) – theo

관련 문제