2014-06-07 2 views
2

오늘 일치하는 지난 달의 날짜를 타겟팅하려고합니다. 그러나 목표 날짜는 해당 월의 영업일 기준으로 계산되어야합니다. 예를 들어, 오늘이 6-JUN-14 일 경우 두 날짜 모두 해당 달에 영업일 기준 16 일이 남았 기 때문에 7-MAY-14를 제공하는 쿼리가 필요합니다. 또한 SQL Developer를 사용하고 있습니다.다른 달의 달 남은 근무일 기준으로 같은 날짜 일치

+1

은 당신이 무엇을 시도했다의 예를 줄 수

, prev as (select weekday , row_number() over (order by weekday desc) rn from ( select fd + (level-1) weekday from bds connect by level <= ld-fd ) where to_char(weekday,'D') not in ('6','7') and weekday not in (select holiday from public_holidays) ) 

... 우리에게이 결과 집합을 제공합니다 ... : 우리는이 같은 하위 쿼리에 해당 테이블을 포함 할 수있다? – pstenstrm

+0

먼저 이것을 확인하십시오 : http : //stackoverflow.com/questions/252519/count-work-days-between-two-dates –

+0

@manu - 날짜 산술은 RDBMS의 다양한 맛이 상당히 다릅니다. 따라서 SQL Server 솔루션에 대한 링크가 특히 유용하다고 생각하지 않습니다. – APC

답변

1

요일인지 주말인지를 알 수있는 몇 가지 방법이 있지만 NLS 설정이 적용됩니다. 나는 영국에 있으므로 NLS_TERRITORY에 대한 나의 환경 설정에 따라 토요일과 일요일은 날 번호 6과 7이됩니다. 그러나 미국과 같은 다른 영토는 일요일 숫자 1로 일요일을가집니다. Find out more.

select weekday 
from (select weekday 
       , to_char(weekday,'D') as dayn 
     from (select (sysdate + level) as weekday 
       from dual 
       connect by level <= (last_day(sysdate) - sysdate) 
      ) 
    ) 
where dayn not in ('6','7') 
/

...이 결과 집합을 제공합니다 ...

8* where dayn not in ('6','7') 

WEEKDAY 
--------- 
09-JUN-14 
10-JUN-14 
... 
26-JUN-14 
27-JUN-14 
30-JUN-14 

16 rows selected. 

SQL> 

그래서 우리는 그 논리를 포장 할 수 있습니다

어쨌든,이 쿼리는 이제 사이의 평일 6 월의 끝을 생성 하위 쿼리에서 일 수를 가져오고 일부는 LAST_DAY(), ADD_MONTHS() and TRUNC() magic을 사용하여 지난 달에 대한 유사한 목록을 생성합니다. 월의 날짜의 다음과 같은 범위를 생성

with curr as (select count(*) as nod 
       From 
       (
        select weekday 
        from (select weekday, to_char(weekday,'D') as dayn 
          from (select sysdate + level weekday 
            from dual 
            connect by level <= (last_day(sysdate) - sysdate) 
           ) 
         ) 
        where dayn not in ('6','7') 
       ) 
       ) 
    , bds as (select trunc(add_months(sysdate, -1), 'MM') fd 
         , last_day(add_months(sysdate, -1)) ld 
       from dual) 
    , prev as (select weekday 
         , row_number() over (order by weekday desc) rn 
       from (
         select fd + (level-1) weekday 
         from bds 
         connect by level <= ld-fd 
        ) 
       where to_char(weekday,'D') not in ('6','7') 
       ) 
select prev.weekday 
     , rn 
from prev 
where prev.rn <= (select nod+1 from curr) 
order by prev.weekday 
/

...

30* order by prev.weekday 

WEEKDAY   RN 
--------- ---------- 
08-MAY-14   17 
09-MAY-14   16 
12-MAY-14   15 
... 
28-MAY-14   3 
29-MAY-14   2 
30-MAY-14   1 

17 rows selected. 

SQL> 

자,이 범위는 당신이 제안 범위를 일치하지 않습니다. Whitsun 때문입니다. 영국에서는 2014 년 5 월 26 일이 은행 휴무일이었습니다. 그러나 오라클의 날짜 기능이 이러한 일을 처리 할 수있는 방법은 없습니다. 따라서 공휴일을 계산에 포함하려면 참조 테이블을 만들어야합니다.

WEEKDAY   RN 
--------- ---------- 
07-MAY-14   17 
08-MAY-14   16 
... 
28-MAY-14   3 
29-MAY-14   2 
30-MAY-14   1 

17 rows selected. 

SQL> 
관련 문제