К основному контенту

DB2, календарь, рекурсия

Мне потребовалось создать календарь, да не простой, а к которому можно при-join-ить данные. Хотел получить таблицу вида:
Казалось бы, создай табличку create table'ом. Но так нельзя, да и не интересно.
Воспользуемся рекурсией!
Вот здесь отличный пример рекурсивного запроса в DB2 (ссылка). 
У меня получилась вот такая конструкция:


(1) with mycal (datetime) as (

    (2) select date('2014-01-01') from sysibm.SYSDUMMY1
     union all
    (3) select datetime + 1 days  as datetime from mycal
     where datetime < date('2014-12-31')
    )
(4) select 
datetime, day(datetime) mycal_day, month(datetime) mycal_month, year(datetime) mycal_year
from mycal
order by datetime

Для лучшей читаемости:
В пункте (1) мы объявляем временное табличное выражение (common table expression) с одним столбцом для вывода (datetime)
В пункте (2) мы выбираем дату - начало года. Здесь может быть любая дата, например current date
В пункте (3) мы задаем. если так можно сказать, логику. как будут генериться новые данные. Здесь, на каждой итерации, будет прибавляться один день к предыдущему значению.
В пункте (4) мы выводим результат обычным select'ом

P.S. чтобы понять рекурсию, нужно понять рекурсию (с) (тут вроде бы хорошо написано про рекурсию)

Комментарии

Популярные сообщения из этого блога

Отключить font boosting

Многие встречаются с такой проблемой: иногда шрифты веб-сайта при просмотре с мобильного устройства многократно увеличиваются в размере. Так браузеры мобильных устройств пытаются сделать чтение материалов удобнее. Удобнее для чтения, но неудобнее для разработчиков.

Статистика разрешений экранов.

Теперь на сайте  myresolutionis.ru  доступна статистика разрешений экранов. Статистика собирается на основе данных, полученных от посетителей сайта. Кроме данных о разрешении экрана, никакая другая информация не собирается. Статистика доступна по адресу  http://myresolutionis.ru/page/resstat.php