Все! Достало! Прошло столько лет со дня появления иерархических запросов в ORACLE, столько шикарных примеров их использования лежит в недрах Сети на расстоянии вытянутой ру...Э... Ну, в общем рядом!
Но нет! Мы же не ищем легких путей, мы не ценим набитых кем то другим шишек! Нам нравится ежедневно изобретать велосипеды с квадратными колесами и пытаться заставить их ездить быстро и плавно!
Вот и для генерации последовательности дат нет-нет, но и более-менее опытные разработчики, не подумав начинают целеустремленно создавать таблицы с единственным полем типа DATE, функционал ее наполнения и очистки (это если сделают не temporary table, а обычную heap table) и прочие супер-навороты.
А я давным давно в недрах, кажется, SQL.RU откопал оставленный кем-то пример генерации последовательности дат с помощью обычного иерархического запроса и взял его на заметку. Оговорюсь сразу, что используя схожий подход, можно генерировать не только последовательности дат, но и различные другие последовательности, как числовые, так и строковые.
Ладно, хватит текста, привожу пример, генерирующий даты с 01.12.2008 по 31.12.2008:
Если все еще нужен комментарий, то пожалуйста! В секции запроса connect by ставим граничное условие связывания с помощью выражения (ДатаНачала + LEVEL -1) <= ДатаКонца, в виде столбца запроса выводим (ДатаНачала + LEVEL -1). "-1" в выражениях появляется из-за того, что LEVEL начинается с единицы. Ну а DUAL... ну куда ж без DUAL то! Для генерации граничных дат можно использовать не только константы, но и пользовательские функции. Также похожий запрос часто используется мной для генерации последовательностей дат вида +-месяц от текущей даты.
Но нет! Мы же не ищем легких путей, мы не ценим набитых кем то другим шишек! Нам нравится ежедневно изобретать велосипеды с квадратными колесами и пытаться заставить их ездить быстро и плавно!
Вот и для генерации последовательности дат нет-нет, но и более-менее опытные разработчики, не подумав начинают целеустремленно создавать таблицы с единственным полем типа 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 то! Для генерации граничных дат можно использовать не только константы, но и пользовательские функции. Также похожий запрос часто используется мной для генерации последовательностей дат вида +-месяц от текущей даты.
Комментариев нет:
Отправить комментарий