2016-08-09 4 views
0

Я работаю над приложением, которое будет получать отчет между определенными диапазонами дат. Существует возможность выбора нескольких вариантов выбора даты. Обычно у нас есть выбор частоты как ежемесячно, ежеквартально и ежегодно. Поэтому любое количество диапазонов дат (по любому типу частот) может быть выбрано без каких-либо перекрывающихся периодов. Теперь в отчете мне нужно показать диапазон дат выбора в единицах месяца, используя Postgresql. Это возможно?DateRange in Postgresql

например Пример запроса:

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. Дата была выбрана путем выбора ежемесячной частоты (январь-март)
  2. Дата была выбрана путем выбора квартального частоты (Q2 2006)
  3. Дата выбрана путем выбора Квартальной частоты (Q3 и Q4 за 2006 год)
  4. Дата была избираются путем выбора Ежегодных частот (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

Спасибо, Гордон ..... Это действительно сработало. Но нормальный отчет будет получать почти лакши записей. Как вы оцениваете эффективность запроса? И еще одно: мы используем широковещательный календарь (широковещательный календарь ... этот календарь всегда начинается с понедельника). Итак, первый диапазон дат 2005-12-26 и 2006-03-26 Я получаю диапазон дат с декабря 2005 года по март 2006 года, где, как пользователь в передней части приложения, был выбран в январе2006-го марта 2006 года. Пожалуйста, помогите на этом –

+0

@ChitraThirugnanasambandam. , , Для выполнения запросов вы должны попробовать свои данные в своих системах. –