2012-04-23 2 views
1

내가 뭔가를 필요에 따라 단지 하나의 레코드를 반환이 삽입 된 일에 대한 기록을 좁힐 좋은 작품오라클의 경우 절

SELECT * FROM(
    SELECT 
     CASE 
      WHEN TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM') = '10' 
      THEN 
       TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM') 
      WHEN SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 1, 1) = '0' 
      THEN 
       SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 2, 1) 
      ELSE 
       SUBSTR (TO_CHAR (ADD_MONTHS(:DATEINPUT, 1), 'MM'), 1, 2) 
     END 
      AS CUR_MONTH_FRMTD, 
     P.OPR_DATE, 
     P.INDICE, 
     P.LOAD_TYPE, 
     P.CONTRACT_MONTH, 
     P.CONTRACT_YEAR, 
     P.VALUE, 
     P.DATE_INSERTED, 
     P.DATE_UPDATED 
    FROM ZE_DATA.PWX_FWD_CURVE P) Q 
    WHERE 
    Q.LOAD_TYPE = 'HLH' 
    AND Q.INDICE = 'MidC' 
    AND Q.CONTRACT_YEAR = TO_CHAR(:DATEINPUT, 'YYYY') 
    AND Q.CONTRACT_MONTH = Q.CUR_MONTH_FRMTD 
    AND TO_CHAR(Q.DATE_INSERTED, 'MM') = TO_CHAR(:DATEINPUT, 'MM') 
    AND TO_CHAR(Q.DATE_INSERTED, 'YY') = TO_CHAR(:DATEINPUT, 'YY') 
    AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT, 'DD') 

다음 쿼리를이 곳에서 문. 그러나 문제는 토요일이나 일요일에 기록이 삽입되지 않아 필터링의 유용성을 깨뜨리는 것입니다.

토요일 또는 일요일에는 금요일 데이터를 받아야합니다. 나는 아래의 논리가 효과가있을 것이라고 생각했다. 그러나 이것은 oracle SQL에서 수행 될 수 없습니다.

IF TO_CHAR(:DATEINPUT, 'DAY') = 'SATURDAY' THEN 
    WHERE 
    .... 
    AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-1, 'DD') 
    ELSE IF TO_CHAR(:DATEINPUT, 'DAY') = 'SUNDAY' THEN 
    WHERE 
    .... 
    AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-2, 'DD') 

이 시점에서 나는 select 문에서이 작업을 수행해야합니다. 저장 프로 시저를 사용할 수 없습니다. 누구든지 해결책이나 해결책을 생각할 수 있습니까? 대신 IF 이유는 단지 중첩되지 또는이

Where ... 
    AND 
    (
     (TO_CHAR(:DATEINPUT, 'DAY') = 'SATURDAY' AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-1, 'DD')) 
     OR 
     (TO_CHAR(:DATEINPUT, 'DAY') = 'SUNDAY' AND TO_CHAR(Q.DATE_INSERTED, 'DD') = TO_CHAR(:DATEINPUT-2, 'DD')) 
    ) 
    AND ... 

답변

3

이 방법에 대해, 내가 요구 사항을 이해 한 경우 :

where q.date_inserted = 
     case to_char(:dateinput,'fmDy','nls_date_language = English') 
      when 'Sat' then :dateinput -1 
      when 'Sun' then :dateinput -2 
      else :dateinput 
     end; 

(그것은 경우 약간 더 복잡해진다을 날짜 열 및 매개 변수에 시간이 포함될 수 있습니다. 날짜 열이 인덱싱되지 않거나 파티션 키가 아닌 경우 trunc()을 모두에 넣을 수 있으며 그럴 경우 between 표현을 구성 할 가치가 있습니다.

+0

이것은 내가 필요한 것입니다. 덕분에 – Zolt

+1

좋은, 좋은 해결책. – fa1c0n3r

0

같은