1

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

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の代わりに使用してみましたが、最初に日付に再フォーマットする必要があると思いますか?

ご回答ありがとうございます。

4

3 に答える 3

3

トムカイトはあなたに答えを与えました: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)
于 2012-03-13T14:45:33.710 に答える
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"。(これにより、四半期の最終日のすべての時間が含まれるようになります。)

于 2012-03-13T14:28:14.660 に答える
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

両方の日付の時間コンポーネントは、四半期の最終日の午前0時(つまり、次の四半期の開始の24時間前)になります。範囲に四半期内のすべての可能な日付を含める場合は、四半期の最後を四半期の最終日の23:59:59にすることができます。

于 2012-03-13T14:46:06.443 に答える