Записки жертвы высоких технологий

    Здравствуйте! Мой блог посвящен в большей своей части моей профессиональной деятельности на поприще использования технологий ORACLE для разработки баз данных OLTP и OLAP хранилищ данных. В заметках я периодически размещаю разнообразные SQL, PL/SQL и Java скрипты написанные мной и не только мной, ссылки на интересные источники в сети либо другую полезную информацию, которая каким либо образом касается моей работы с замечательными продуктами компании ORACLE.
    Вы можете связаться со мной по контактному емейлу, если у вас есть какие-либо вопросы, связанные с разработкой баз данных на основе продуктов ORACLE, буду рад помочь вам, если это будет в моих силах.

6 окт. 2009 г.

Представление с последовательностью дат

Все! Достало! Прошло столько лет со дня появления иерархических запросов в ORACLE, столько шикарных примеров их использования лежит в недрах Сети на расстоянии вытянутой ру...Э... Ну, в общем рядом!
Но нет! Мы же не ищем легких путей, мы не ценим набитых кем то другим шишек! Нам нравится ежедневно изобретать велосипеды с квадратными колесами и пытаться заставить их ездить быстро и плавно!
Вот и для генерации последовательности дат нет-нет, но и более-менее опытные разработчики, не подумав начинают целеустремленно создавать таблицы с единственным полем типа DATE, функционал ее наполнения и очистки (это если сделают не temporary table, а обычную heap table) и прочие супер-навороты.
А я давным давно в недрах, кажется, SQL.RU откопал оставленный кем-то пример генерации последовательности дат с помощью обычного иерархического запроса и взял его на заметку. Оговорюсь сразу, что используя схожий подход, можно генерировать не только последовательности дат, но и различные другие последовательности, как числовые, так и строковые.
Ладно, хватит текста, привожу пример, генерирующий даты с 01.12.2008 по 31.12.2008:

create view v_last_month_of_2008 as
select
to_date('01.12.2008','DD.MM.YYYY') + level -1 dt
from
dual
connect by
to_date('01.12.2008','DD.MM.YYYY') + level -1 <= to_date('31.12.2008','DD.MM.YYYY')


Если все еще нужен комментарий, то пожалуйста! В секции запроса connect by ставим граничное условие связывания с помощью выражения (ДатаНачала + LEVEL -1) <= ДатаКонца, в виде столбца запроса выводим (ДатаНачала + LEVEL -1). "-1" в выражениях появляется из-за того, что LEVEL начинается с единицы. Ну а DUAL... ну куда ж без DUAL то! Для генерации граничных дат можно использовать не только константы, но и пользовательские функции. Также похожий запрос часто используется мной для генерации последовательностей дат вида +-месяц от текущей даты.

Комментариев нет: