2012-03-13 1 views
1

저장 프로 시저의 일부로 요약 테이블을 작성 중이며 두 개의 열이 있습니다. 첫 번째 열은 시작을 표시해야하고 두 번째 열은 해당 분기를 지정하는 숫자 인 입력 매개 변수를 기반으로하는 날짜 범위의 끝을 표시해야합니다. AskTom에서 다음을 추출 할 수 있었지만 몇 가지 질문이 있습니다. 1. 여기에 수학 LeapYears 차지할Oracle의 Quarter를 기준으로 기간을 추출하고 표시하려면 어떻게합니까?

Open C1 FOR 
SELECT (SELECT TRUNC (SYSDATE, 'Q')-1+1 AS 'StartOf' FROM DUAL), 
SELECT (SELECT TRUNC(ADD_MONTHS (SYSDATE, +3), 'Q')-2 AS 'EndOf' FROM DUAL) 
FROM DUAL; 

질문은 ... 나는 생각하지 않지만 나는 그것을 처리하는 방법을 모르겠어요.

질문 2. 특정 분기로 'inQuarter'입력 매개 변수를 어떻게 추가합니까? 나는 그것을 sysdate 대신 넣으려고했으나 처음으로 다시 포맷해야한다고 생각하니?

미리 답변 해 주셔서 감사합니다.

+0

왜 -1 + 1입니까? - 그건 그냥 취소 할거야. 어디에서 윤년을 계산해야합니까? 분기 별 날짜는 1-JAN, 1-APR, 1-JUL 및 1-OCT로 특정 분기에 사용합니다. –

+0

@dee - 'inQuarter'는 무엇을 나타 냅니까? 당신은 그것이 아마도 당신에게 매우 특정한 것을 의미하는 "분기를 나타내는 숫자"라고 말하지만 그것이 나에게 무엇인지 명확하지 않습니다. 당신은 현재 연도의 1/4 분기로 해석되어야하는 1과 같은 숫자를 전달하고 있다는 것을 의미합니까? 또는 2004 년 3/4 분기로 해석 될 200403과 같은 숫자가 있습니까? 또는 다른 것? –

+0

정확하게 설명하지 않는 것에 대해 사과드립니다. inQuarter는 분기를 나타내는 한 자리 숫자 1 - 4입니다. 또한 첫 번째 날과 지정한 분기의 마지막 날을 모두 제공해야하는 YYYY 인 inYear도 있음을 상기시킵니다. 빠른 응답을 주셔서 감사합니다. – dee

답변

3

톰 카이트는 당신에게 대답 givven했습니다 http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:250288900346075009

Open C1 FOR 
select add_months(dt, (inQuarter-1)*3), 
     last_day(add_months(dt, (inQuarter-1)*3+2)) 
from (
    select to_date(inYear || '0101', 'yyyymmdd') dt 
    from dual) 
+0

감사합니다, A.B. err Tom .... err A.B. ... 이것은 정확하게 올바르게 작동했습니다. 나는 AskTom에서 시작했다. .. 내가 이것을 놓쳤던 방법을 명확히하지 않는다. – dee

1

내가 제안 :

Open C1 FOR 
SELECT TRUNC (d_inQuarter, 'Q') AS "StartOf", 
     TRUNC(ADD_MONTHS (d_inQuarter, +3), 'Q') AS "EndOf" 
FROM (SELECT add_months(to_date(to_char(i_yr)||'-01-01','YYYY-MM-DD'), (i_q-1)*3) 
     AS d_inQuarter FROM DUAL); 

- i_yr 정수 매개 변수로 각각 연도와 분기 나타내는 i_q.

EndOf는 다음 분기 첫날 자정을 나타 내기 때문에 모든 선택은 조건 < "EndOf" (<= "EndOf"이 아님)을 기반으로해야합니다. (이 분기의 마지막 날에 모든 시간이 포함되어 있는지 확인해야합니다.)

+0

감사 마크, 이건 분명히 내 윤년 문제를 돌봐 줬어. 어떻게하면 두 개의 주어진 매개 변수에서 날짜를 추출 할 수 있습니까? – dee

+0

@dee - 업데이트 된 답변보기 –

1

당신은 변환 할 수있는 숫자 년 숫자 분기 매개 변수를 두 날짜의 DATE

SELECT add_months(trunc(to_date(to_char(<<numeric year>>), 
            'YYYY'), 
          'YYYY'), 
        3 * <<numeric quarter>>) first_of_quarter, 
     add_months(trunc(to_date(to_char(<<numeric year>>), 
            'YYYY'), 
          'YYYY'), 
        4 * <<numeric quarter>>) - 1 last_of_quarter, 
    FROM dual 

시간 구성 요소 (예 : 24 시간 다음 분기의 시작 전)을 분기의 마지막 날 자정이 될 것입니다. 범위가 분기의 모든 가능한 날짜를 포함하도록하려면 분기 마지막 날짜가 분기 마지막 날인 23:59:59가되도록 할 수 있습니다.

+0

세 가지 답변이 모두 제공됩니다. 모두에게 감사드립니다. – dee

관련 문제