2012-03-13 5 views
1

私はストアドプロシージャの一部としてサマリーテーブルを構築していますが、私は2つのカラムを持っています。最初の列は開始を示す必要があり、2番目の列は、四半期を指定する数字である入力パラメーターに基づく日付範囲の終わりを示す必要があります。私はAskTomから以下を抽出することができましたが、いくつか質問があります。Oracleの四半期に基づいて日付範囲を抽出して表示するにはどうすればよいですか?

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; 

質問1.ここに数学がLeapYearsを占めるだろう...私はそれはないと思うが、私はそれを処理するかどうかはわかりません。

質問2.入力パラメータ 'inQuarter'を特定の四半期に追加するにはどうすればよいですか?私はsysdateの代わりにそれを置いてみましたが、私は最初にそれを再フォーマットする必要がありますか?

お返事ありがとうございます。

+0

なぜあなたは-1 + 1を持っていますか? - それはただ取り消すつもりです。うるう年についてはどこで説明する必要がありますか?四半期の日付は、1-JAN、1-APR、1-JUL、および1-OCTです。これは特定の四半期に使用する予定です。 –

+0

@dee - inQuarterは何を表していますか?あなたはそれがおそらくあなたにとって非常に特有のものを意味する「四半期を指定する数字」だと言いますが、それが私にとって何であるかははっきりしません。今年の第1四半期に解釈されるはずの1のような数字を渡しているということですか?それとも、2004年の第3四半期に解釈されるはずの200403のような数字があるのでしょうか?または、他の何か? –

+0

適切に明確化されていないことに対する謝罪。 inQuarterは、四半期を示す1桁の数字の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

ありがとうございます、これは間違いなく私のうるう年の世話をするために私に見えます。どのように私は私の2つの指定されたパラメータから日付を抽出することができますか? – 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

3つの答えがすべて提供されました。みんなありがとう。 – dee

関連する問題