2016-08-09 6 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. 날짜를 매달 주파수를 선택하여 선택한는
  3. 분기 주파수 (2006 년 Q2)를 선택하여 선택된
  4. 분기 별 빈도 (2006 년의 3 분기 및 4 분기)를 선택하여 날짜를 선택했습니다.
  5. 날짜가 s 연간 주파수 (2008)

을 선택하여 선출 그래서 지금 내 보고서

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

을 감안할 때 당신의 개월 달력이 말하는 것보다 다르게 정의 된 경우,'calendar' 테이블이 당신에게 엄청난 혜택을 줄 것입니다. 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 만 개의 레코드를 가져옵니다. 쿼리 성능에 대한 귀하의 의견은 어떻습니까? 그리고 한 가지 더, 우리는 방송 일정 (Broadcast Calendar ...이 달력은 항상 월요일로 시작합니다)을 사용하고 있습니다. 따라서 2005-12-26과 2006-03-26의 첫 번째 날짜 범위는 2006 년 12 월에서 3 월으로 날짜 범위를 가져옵니다. 여기서 응용 프로그램의 프런트 엔드 사용자는 January2006-march2006으로 선택했습니다. 제발 도와주세요 –

+0

@ChitraThirugnanasambandam. . . 성능 향상을 위해서는 시스템의 데이터를 사용해 봐야합니다. –