2013-04-18 3 views
0

좋은 하루, 나는 몇 가지 코드 일하고 곳 - 목요일오라클 SQL은 11g - 다음 영업일 쿼리

1) 요청이 평일 오후 5 동부 시간대 (미국) 이후에 제출 된 경우 (월) 그리고 평일 오전 7시 59 분 59 초 (동부 표준 시간대) 전에는 오전 8시에 다음 영업일로 변경됩니다.

2) 금요일 오후 5시에서 월요일 오전 7시 59 분 59 분 전에 요청이 제출 된 경우 위에 언급 된 시간보다 롤업됩니다.

3) 그런 다음 코드는 다른 날짜 필드를 확인하여 "수락"시간 (제출 된 날짜 또는 "새"날짜의 4 시간 이내)을 비교해야합니다. 예를 들어

:

요청 001 2013년 4월 17일 오전 2시를 제출 한 경우, 새로운 날짜는 2013년 4월 17일 오전 8시 될 것입니다.

요청 002가 04/17/2013 06:45 PM에 제출 된 경우 새로운 날짜는 04/18/2013 08:00 AM입니다.

요청 003이 제출되면 04/20/2013 05:45 AM (토요일 임)이며, 새 날짜는 04/22/2013 08:00 AM입니다.

저는 코드를 함께 조각 냈습니다. 최종 코드에서이 코드를 모두 가져올 수 있기를 바랍니다.


내가 요청 4 시간

 SELECT RIT_Request_v.* 
    ,CASE 
    WHEN DATE_ACCEPTED IS NULL THEN 'NOT ACKNOWLEDGED' 
    WHEN DATE_ACCEPTED > (DATE_REQUESTED + 4/24) THEN 'OVER 4 HOURS' 
    ELSE 'WITHIN 4 HOURS' 
    END AS Acknowledgement 

    FROM RIT.RIT_Request_v 

    WHERE (("DATE_REQUESTED") BETWEEN trunc(sysdate, 'YYYY') AND trunc(sysdate)) 
내에서 인정 된 경우 코드를 확인하려면

  ,CASE 
     WHEN to_date(('DATE_REQUESTED'),'DAY',nls_date_language = English) in ('Friday','Saturday')) 
     THEN NEXT_DAY(to_date(('DATE_REQUESTED'),'Monday') + 8/24) 
     ELSE DATE_REQUESTED 
    END as Weekend_Converted 

(날짜 변환 코드) 지금까지 무엇을 가지고


아래 내 의견 중 하나에 언급했듯이 코드, 지금은 무엇입니까 "잘못된 식별자"오류 - weekend_converted은 원래 버전에서 주말을 처리하는 것, 그리고 금요일에 아무것도가 포함되어 혼동 될 것으로 보인다 생성

SELECT RIT_Request_v.* 
    ,CASE WHEN TO_CHAR(DATE_REQUESTED,'D') IN (1,6,7) 
      THEN NEXT_DAY(DATE_REQUESTED,'MONDAY') 
      ELSE DATE_REQUESTED + 1 END AS Weekend_Converted 

    ,CASE WHEN DATE_ACCEPTED IS NULL THEN 'NOT ACKNOWLEDGED' 
      WHEN WEEKEND_CONVERTED IS NULL THEN 'NOT ACKNOWLEDGED' 
      WHEN DATE_ACCEPTED > (DATE_REQUESTED + 4/24) THEN 'OVER 4 HOURS' 
      WHEN DATE_ACCEPTED > (Weekend_Converted + 4/24) THEN 'OVER 4 HOURS' 
      ELSE 'WITHIN 4 HOURS' END AS Acknowledgement 

    FROM RIT.RIT_Request_v 

    WHERE (("DATE_REQUESTED") BETWEEN trunc(sysdate, 'YYYY') AND trunc(sysdate)) 

       AND FORM_ID IN   (2011,2014,5007,5036,5039,7007,10000,10001,10005,10007,10011,10024,10025,10029,10032,10033,10034,10035,10036,10037,11011,11013,11999,36001) 
+0

나는이 항목을 발견 http://stackoverflow.com/questions/4677984/need-to-find-next-and-previous-working-day-in-oracle 및 다음과 같이 내 코드를 업데이트했지만 "잘못된 식별자"오류가 나타납니다. 나는 오타가 있다는 것을 믿지 않는다. 나는 다른 것을해야 할까? –

답변

0

귀하의 case; 업데이트 된 날짜는 다음 날 또는 다음 월요일 중 매일 같은 날짜로 이동합니다. 평일 대부분의 시간에 08:00 부분과 그 부분을 모두 잃어 버리면 하루를 전혀 바꿀 수 없습니다.

weekend_converted 가상 배열을 정의한 다음 동일한 수준의 쿼리에서 사용할 수 없기 때문에 두 번째 버전에서 '잘못된 식별자'가 표시되었습니다. 허용되지 않습니다. 한 레벨에서 정의해야하고, 바깥 쪽 select에서 참조해야합니다.

이 규칙을 커버하는 것 같다,하지만 난 여분의 날짜와 함께 테스트하지 않았습니다 :

select r.*, 
    case 
     when to_char(date_requested, 'DY', 
       'NLS_DATE_LANGUAGE=English') in ('SAT', 'SUN') 
      or (to_char(date_requested, 'DY', 
       'NLS_DATE_LANGUAGE=English') = 'FRI' 
       and extract(hour from cast(date_requested as timestamp)) >= 17) 
     then trunc(next_day(date_requested, 'MON')) + interval '8' hour 
     when extract(hour from cast(date_requested as timestamp)) >= 17 
     then trunc(date_requested) + interval '1' day + interval '8' hour 
     when extract(hour from cast(date_requested as timestamp)) < 8 
     then trunc(date_requested) + interval '8' hour 
     else date_requested 
    end as clock_start 
from rit_request_v r; 

NLS_DATE_LANGUAGE을 강제하는 것은 좋은 생각입니다 동안이 실행 위치를 모르는 경우, 비록 , next_day 함수는 day 매개 변수가 현지 언어로되어 있어야하므로 함수 단위가 아닌 전체 세션에서 설정하는 것이 좋습니다.어쨌든

, 그 제공 :주는

with t as (
select r.*, 
    case 
     when to_char(date_requested, 'DY', 
       'NLS_DATE_LANGUAGE=English') in ('SAT', 'SUN') 
      or (to_char(date_requested, 'DY', 
       'NLS_DATE_LANGUAGE=English') = 'FRI' 
       and extract(hour from cast(date_requested as timestamp)) >= 17) 
     then trunc(next_day(date_requested, 'MON')) + interval '8' hour 
     when extract(hour from cast(date_requested as timestamp)) >= 17 
     then trunc(date_requested) + interval '1' day + interval '8' hour 
     when extract(hour from cast(date_requested as timestamp)) < 8 
     then trunc(date_requested) + interval '8' hour 
     else date_requested 
    end as clock_start 
from rit_request_v r 
where date_requested between trunc(sysdate, 'YYYY') and trunc(sysdate) 
and form_id in (2011, 2014, 5007, 5036, 5039, 7007, 10000, 10001, 10005, 10007, 10011, 10024, 10025, 10029, 10032, 10033, 10034, 10035, 10036, 10037, 11011, 11013, 11999, 36001) 
) 
select t.*, 
    case 
     when date_accepted is null then 'NOT ACKNOWLEDGED' 
     when date_accepted > (clock_start + interval '4' hour) 
     then 'OVER 4 HOURS' 
     else 'WITHIN 4 HOURS' 
    end as acknowledgement 
from t; 

:

DATE_REQUESTED DATE_ACCEPTED  FORM_ID CLOCK_START  ACKNOWLEDGEMENT 
---------------- ---------------- ---------- ---------------- ---------------- 
2013-04-17 02:00 2013-04-17 11:59  5007 2013-04-17 08:00 WITHIN 4 HOURS 
2013-04-17 18:45 2013-04-18 11:59  5007 2013-04-18 08:00 WITHIN 4 HOURS 
2013-04-13 05:45      5007 2013-04-15 08:00 NOT ACKNOWLEDGED 

내가 참조 할 수

DATE_REQUESTED DATE_ACCEPTED  FORM_ID CLOCK_START 
---------------- ---------------- ---------- ---------------- 
2013-04-17 02:00 2013-04-17 11:59  5007 2013-04-17 08:00 
2013-04-17 18:45 2013-04-18 11:59  5007 2013-04-18 08:00 
2013-04-13 05:45      5007 2013-04-15 08:00 

그런 다음 인라인보기로 또는 CTE 같은 것을 사용할 수 있습니다 clock_start으로 정의되어 있기 때문에 낮은 수준에서 정의됩니다 (이 경우 CTE).

내 날짜가 귀하와 완전히 다른 형식임을 알 수 있습니다. 일반적으로 표시하려면 to_char() 필드를 래핑해야하지만 (a) SQL * Plus에 표시 될지 또는 다른 곳으로 피드 될지 명확하지 않으며 날짜로 유지되어야합니다. NLS_DATE_LANGUAGE를 확인하기 위해 세션을 변경하면 거기에있는 동안 NLS_DATE_FORMAT를 설정할 수 있습니다. 다시 한 번 당신이 그것을 실행하는 도우에 달려 있습니다.

잘못된 수준의 sysdate에 대한 확인이있을 수도 있습니다. 현재 조정 전 시간에 작업 중이기 때문에 오늘 08:00의 clock_start을 포함하는 항목이 포함됩니다. 해당 항목을 바깥 쪽 select으로 이동하면 clock_start이 해당 날짜 범위에 있는지 확인할 수 있습니다. 물론 의도적으로 그렇게했을 수도 있습니다. 도움이

희망 ...

+0

당신은 내 친구가 절대적인 천재입니다 - 이것은 내가 필요한 것에 완벽합니다. 나는 트랙에서 너무 멀리 떨어져 있었다. .. 고맙다. 나는 크게 도움에 감사한다!! –