2014-05-23 3 views
0

누군가가 이것을 도와 줄 수 있기를 바랍니다. 아래에 간단한 예제를 넣었습니다. 청구 목적으로 청구 날짜에 맞는 만기일을 설정하려면 공휴일과 주말을 건너 뛰야합니다. 나는 회사를 위해 모든 휴일을 지키는 휴일 테이블을 가지고있다. (그리고 토요일과 같은 주말을 포함 할 수도있다. 은행과 같은 회사는 아직 확실하지 않다.테이블에서 연속 휴일/주말을 계산하십시오.

연속 주말 플러스 데이터베이스에서 연휴를 알아야합니다. 예를 들어 데이터베이스에 휴가 데이터의 경우

는 :

EXCP_DATE ID 
----------- ---------- -------------------- ---------- 
3/29/2013 1 
4/1/2013 1 
12/9/2013 1 
12/10/2013 1 
12/25/2013 1 
12/26/2013 1 
12/27/2013 1 
12/28/2013 1 

나는 "발행 수"열에서 휴일 및 주말의 번호가 필요합니다. 연휴/주말 내 CONSECUTIVE_DAY는 : 1 날짜가

ID EXCP_DATE WeekDay CONSECUTIVE_DAY OCCURENCES 
1 3/29/2013 FRIDAY 1 3 
2 4/1/2013 MONDAY 0 1 
3 12/9/2013 MONDAY 1 2 
4 12/10/2013 TUESDAY 0 1 
5 12/25/2013 WEDNESDAY 1 5 
6 12/26/2013 THURSDAY 1 4 
7 12/27/2013 FRIDAY 1 3 
8 12/28/2013 SATURDAY 1 2 

아래는 대부분의 경우에 작동하는 쿼리입니다 연휴/주말을 의미합니다. 그것은 한 단계 만 이끌어 가면서 연속 휴일이 2 회 이상일 때만 실패합니다.

SELECT A.* 
    ,CASE 
     WHEN CONSECUTIVE_DAY = 1 
      THEN CASE 
        WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY' 
         AND LEAD(EXCP_DATE) OVER (
          ORDER BY EXCP_DATE 
          ) = (EXCP_DATE + 3) 
         THEN DATEdiff(dd, EXCP_DATE, LEAD(EXCP_DATE) OVER (
            ORDER BY EXCP_DATE 
            )) + 1 
        WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY' 
         AND LEAD(EXCP_DATE) OVER (
          ORDER BY EXCP_DATE 
          ) <> (EXCP_DATE + 3) 
         THEN 3 
        ELSE DATEdiff(dd, EXCP_DATE, LEAD(EXCP_DATE) OVER (
           ORDER BY EXCP_DATE 
           )) + 1 
        END 
     ELSE CONSECUTIVE_DAY 
     END OCCURENCES 
FROM (
    SELECT T.* 
     ,upper(datename(weekday, EXCP_DATE)) WeekDay 
     ,Lead(EXCP_DATE, 1, EXCP_DATE) OVER (
      ORDER BY EXCP_DATE 
      ) Lead 
     ,EXCP_DATE + 1 [EXCP_DATE + 1] 
     ,EXCP_DATE + 3 [EXCP_DATE +3] 
     ,datename(weekday, EXCP_DATE + 3) [DateName_EXCP_DATE +3] 
     , 
     --------------------------- 
     CASE 
      WHEN Lead(EXCP_DATE, 1, EXCP_DATE) OVER (
        ORDER BY EXCP_DATE 
        ) = EXCP_DATE + 1 
       THEN 1 
      WHEN upper(datename(weekday, EXCP_DATE)) = 'FRIDAY' 
       AND LEAD(EXCP_DATE) OVER (
        ORDER BY EXCP_DATE 
        ) = EXCP_DATE + 3 
       THEN 1 
      WHEN upper(datename(weekday, EXCP_DATE)) = 'SATURDAY' 
       AND LEAD(EXCP_DATE) OVER (
        ORDER BY EXCP_DATE 
        ) = EXCP_DATE + 2 
       THEN 1 
      ELSE 0 
      END CONSECUTIVE_DAY 
    FROM TEST1 T 
    ) A 

----------------------------------- 숫자 5와 6이 올바르지 않습니다. . 리드에서 재귀를 수행하려면 어떻게해야합니까?

그 결과 어떤 도움

ID EXCP_DATE WeekDay Lead EXCP_DATE + 1 EXCP_DATE +3 DateName_EXCP_DATE +3 CONSECUTIVE_DAY OCCURENCES 
1 3/29/2013 FRIDAY 4/1/2013 3/30/2013 4/1/2013 Monday 1 4 
2 4/1/2013 MONDAY 12/9/2013 4/2/2013 4/4/2013 Thursday 0 0 
3 12/9/2013 MONDAY 12/10/2013 12/10/2013 12/12/2013 Thursday 1 2 
4 12/10/2013 TUESDAY 12/25/2013 12/11/2013 12/13/2013 Friday 0 0 
5 12/25/2013 WEDNESDAY 12/26/2013 12/26/2013 12/28/2013 Saturday 1 2 
6 12/26/2013 THURSDAY 12/27/2013 12/27/2013 12/29/2013 Sunday 1 2 
8 12/27/2013 FRIDAY 12/28/2013 12/28/2013 12/30/2013 Monday 1 3 
7 12/28/2013 SATURDAY 12/28/2013 12/29/2013 12/31/2013 Tuesday 0 0 

감사합니다.

+1

누구나이 내용을 읽고 이해하기를 어떻게 기대합니까? 게시물의 형식을 적절하게 지정하십시오. – EkoostikMartin

+1

코드가 SQL Server (및 버전 2012+)와 비슷해 보이기 때문에 sql-server 태그를 추가했습니다. –

답변

0

다른 접근 방식을 사용합니다. 시작 날짜가 제공되면 다음 유효한 비즈니스 날짜를 반환하는 함수를 만듭니다.

예를 들어 다른 사람의 만기 날짜가 2014 년 5 월 24 일 (토요일)으로 계산됩니다. 이 값을 함수에 전달하여 다음 유효한 비즈니스 날짜를 반환 할 수 있습니다. 여기에 제가 작성한 빠른 기능이 있습니다.

이 함수는 [휴일] 테이블에 회사의 휴일 휴일이 들어 있다고 가정합니다.

CREATE FUNCTION [dbo].[NextBusinessDay] 
(
    @BusinessDay DATE 
) 
RETURNS DATE AS 
BEGIN 
    DECLARE @GoodDay DATE; 
    WITH cte AS (
     SELECT @BusinessDay AS good_date 
     UNION ALL 
     SELECT DateAdd(d,1,good_date) 
     FROM CTE 
     WHERE good_date < DateAdd(d,7,@BusinessDay) 
    ) 
    SELECT @GoodDay = min(good_date) FROM cte 
    WHERE Upper(DateName(WEEKDAY, good_date)) NOT IN ('SATURDAY','SUNDAY') 
    AND NOT EXISTS (SELECT [Holiday] FROM [Holidays] WHERE [Holiday] = good_date); 
    RETURN @GoodDay; 
END; 

그러면 날짜를 전달하기 만하면됩니다. 위의 예,이 2014년 5월 24일 및 2014년 5월 25일이 주말이기 때문에, 2014년 5월 27일을 반환하고 2014년 5월 26일 것에서

SELECT DueDate, [dbo].[NextBusinessDay](DueDate) FROM Whatever 

은 휴일 (당신은 기념관이있는 경우 휴일 테이블의 하루).

관련 문제