반응형

2023년 근무일수을 알 수 있는 sql문입니다.
1주차는 1월 2일 월요일에 시작합니다.
한국의 공휴일을 기준으로 공휴일은 제외됩니다.

DECLARE @StartDate DATE = '2023-01-02';
DECLARE @EndDate DATE = '2023-12-31';

WITH cte AS (
  SELECT @StartDate AS WorkDay, DATENAME(WEEKDAY, @StartDate) AS WeekDay
  UNION ALL
  SELECT DATEADD(DAY, 1, WorkDay), DATENAME(WEEKDAY, DATEADD(DAY, 1, WorkDay))
  FROM cte
  WHERE WorkDay < @EndDate
)
SELECT COUNT(*) AS WorkingDays
FROM cte
WHERE WeekDay = 'Monday' 
  AND WorkDay NOT IN (
    '2023-01-02', -- New Year's Day
    '2023-02-01', -- Lunar New Year's Day
    '2023-02-02', -- Lunar New Year's Day
    '2023-02-03', -- Lunar New Year's Day
    '2023-03-01', -- Independence Movement Day
    '2023-05-05', -- Children's Day
    '2023-05-22', -- Buddha's Birthday
    '2023-06-06', -- Memorial Day
    '2023-08-15', -- Liberation Day
    '2023-09-20', -- Chuseok (Mid-Autumn Festival) Day
    '2023-09-21', -- Chuseok (Mid-Autumn Festival) Day
    '2023-09-22', -- Chuseok (Mid-Autumn Festival) Day
    '2023-10-03'  -- National Foundation Day
  )

 쿼리는 2023년 1월 2일부터 2023년 12월 31일 사이의 모든 날짜 목록을 생성하기 위해 공통 테이블 식(CTE)을 사용합니다. CTE는 @StartDate 값으로 시작하여 @EndDate에 도달할 때까지 한 번에 하루씩 재귀적으로 추가합니다.

그런 다음 주 쿼리는 한국의 휴일을 기준으로 휴일이 아닌 월요일인 CTE의 일 수를 카운트합니다. 휴일은 메인 쿼리의 WHERE 절에 있는 NOT IN 절을 사용하여 제외됩니다.

이 쿼리에 포함된 휴일은 2023년 한국 달력을 기준으로 하며, 다른 해에는 정확하지 않을 수 있습니다. 또한 이 쿼리는 주말에 사무실이 쉰다고 가정합니다. 사무실이 주말에 열려 있는 경우 WHERE 절에서 Week Day = 'Monday' 조건을 제거할 수 있습니다.

반응형

+ Recent posts