2016-08-09 21 views
0

私は、特定の日付範囲の間にレポートを取得するアプリケーションに取り組んでいます。複数の日付選択を選択する可能性があります。通常、毎月、四半期、および毎年の頻度の選択肢があります。したがって、任意の頻度タイプの任意の日付範囲を、重なり期間なしで選択することができます。今レポートでは、PostgreSQLを使用して選択期間を月単位で表示する必要があります。それは可能ですか?PostgreSQLのDateRange

などのサンプルクエリ:

select dt, description 
from table1 
where (
    dt between '2005-12-26' and '2006-03-26' 
    or dt between '2006-03-27' and '2006-06-25' 
    or dt between '2006-06-26' and '2006-12-31' 
    or dt between '2007-12-31' and '2008-12-28' 
) 
group by dt, description 
order by dt, description 

ここ

  1. 日は(3月月)毎月の周波数を選択することによって選択された
  2. は日が(2006年の第2四半期)四半期周波数を選択することによって選択された
  3. [四半期頻度(2006年の第3四半期および第4四半期)]を選択して日付を選択しました
  4. 日付はs毎年周波数(2008)

を選択することによって選出だから今、私のレポートは

Date   DateRange     Description 
2006-01-01 January2006-March2006   XXXXXXXXXXX 
2006-08-31 July2006-Dec2006    UUUUUUUUUUU 
2008-05-20 January2008-dec2008   ZZZZZZZZZZ 
+0

考えること、あなたの月と年はカレンダーとは異なって定義されているので、 'カレンダー'テーブルはあなたに非常に有益です。 PKは日付、その他のフィールドはビジネスルールに従って年、月などを指定します。 –

答えて

0

のようになります。私は、あなたがjoin、このような何かしたいと思う:

select dt, to_char(r.date1, 'MonthYYYY') || '-' || to_char(r.date2, 'MonthYYYY') as daterange, 
      description 
    from table1 t join 
     (select '2005-12-26'::date as date1, '2006-03-26'::date as date2 union all   
     select '2006-03-27'::date, '2006-06-25'::date union all 
     select '2006-06-26'::date, '2006-12-31'::date union all 
     select '2007-12-31'::date, '2008-12-28'::date 
     ) r 
     on t.dt between r.date1 and r.date2 
    group by t.dt, r.date1, r.date2, t.description 
    order by dt, description; 
+0

ありがとうゴードン.....本当に働いた。しかし、通常のレポートでは、ほぼ1レコードのレコードが取り出されます。クエリのパフォーマンスに関するあなたの意見は何ですか?もう1つは、ブロードキャストカレンダー(ブロードキャストカレンダー...このカレンダーは常に月曜日から始まります)を使用しています。したがって、2005-12-26と2006-03-26の最初の日付範囲では、2005年12月から2006年3月の日付範囲を取得しています。ここでは、アプリケーションのフロントエンドのユーザーがJanuary2006-march2006として選択されます。これで助けてください –

+0

@ChitraThirugnanasambandam。 。 。パフォーマンスクエストの場合、システム上のデータを試してみる必要があります。 –

関連する問題