gifts2017

календарик или выборка дат

Опубликовал Дмитрий Никитин (grub) в раздел Программирование - Практика программирования

Есть много разных решений для получиния в запросе выборки дат за период

для типовых конфигураций возможны решения использующие различные регистры сведений например курсы валют или производственный календарь.

мой вариант не зависит от конфигурации, он сделан на основе нескольких размещенных здесь и на мисте и оптимизирован по объему кода, и количеству виртуальных таблиц \ вложенных запросов

ВЫБРАТЬ
            0 КАК a
Поместить vt_aa           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                1
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                2
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                3
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                4
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                5
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                6
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                7
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                8
           
            ОБЪЕДИНИТЬ
           
            ВЫБРАТЬ
                9
                ;
ВЫБРАТЬ
    ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, РазностьДат.НомерДняИзДиапазона) КАК датаПериода
ПОМЕСТИТЬ Даты   
ИЗ
    (ВЫБРАТЬ
        bb.a * 100 + cc.a * 10 + dd.a КАК НомерДняИзДиапазона
    ИЗ
         vt_aa КАК bb           
            ПОЛНОЕ СОЕДИНЕНИЕ vt_aa КАК cc
            ПО (ИСТИНА)
            ПОЛНОЕ СОЕДИНЕНИЕ vt_aa КАК dd
            ПО (ИСТИНА)) КАК РазностьДат
ГДЕ
    РазностьДат.НомерДняИзДиапазона < РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)

если не хватает размера выборки то можно увеличить изменив строку

        bb.a * 100 + cc.a * 10 + dd.a КАК НомерДняИзДиапазона

на    aa.a*1000 +     bb.a * 100 + cc.a * 10 + dd.a КАК НомерДняИзДиапазона

и добавив полное соединение

            ПОЛНОЕ СОЕДИНЕНИЕ vt_aa КАК aa
            ПО (ИСТИНА)

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Алексей Константинов (alexk-is) 15.05.10 10:53
Вот календарик в диапазоне до 2739 лет. http://www.infostart.ru/public/68269/
Работает значительно быстрее.
2. Дмитрий Никитин (grub) 15.05.10 17:49
(1) замеры в студию :!: твой слишком громоздкий куча временных таблиц и в зависимости от диапазона дат ( периода ) твой будет выдавать разную скорость, твой смотрел механизмы похожи мне мой больше нравится он проще короче и в нём только одна временная таблица

p.s на практике отчеты с выборкой по дням за период больше года не делаются не читабельно обычно хватает месяца за глаза
3. Eugeneer (Eugeneer) 15.05.10 18:44
"Есть много разных решений для получиния в запросе выборки дат за период"
Так сделайте полноценную статью с перечнями этих всех вариантов. Ваш вариант далеко не самый лучший. а один из худших.
4. Eugeneer (Eugeneer) 15.05.10 18:47
Почему нельзя просто использовать производственный календарь который есть во всех типовых. Просто, удобно, легко и лучшее что только может быть.
5. Алексей Константинов (alexk-is) 15.05.10 21:06
(2) Вариант указанный по ссылочке будет стабильно работать от 01.01.0001 по текущую дату ещё 700 лет. В комментариях указаны диапазоны и выбросить "не нужные" таблицы проблем не составляет. Замеры сейчас сделаю.
6. Дмитрий Никитин (grub) 15.05.10 21:59
(3) на полноценную статью пока нет времени сравнить с решением alexk-is сравним
один из худших. - каковы критерии ?

(4) можно пальцем в типовой где посмотреть ( если это зарплата то я с ней не работаю)
7. Eugeneer (Eugeneer) 15.05.10 22:05
В УТ есть регистр сведений - производственный календарь. все даты , учет выходных, праздников и чего угодно. Обычнй запрос в пять строк - получение любого промежутка с учетом всего соприкасающегося.
8. Eugeneer (Eugeneer) 15.05.10 22:06
Также в типовых очень много есть моментов где как раз с ним идут запросы. Да и я использовал также в некоторых разработках именно данный метод.
9. Дмитрий Никитин (grub) 15.05.10 22:19
(5) Замеры сделанные в ИР
Время формирования результата - 16 мс
Время формирования результата - 15 мс
Время формирования результата - 0 мс
вот такой разброс для обоих запросов
в iE мой показывает 0,1
ваш 0,1 - 0,3 так что где ваш работает значительно быстрее не вижу
10. Дмитрий Никитин (grub) 15.05.10 22:21
(8) для типовой волне нормальное решение, если нужно универсальный внешний запрос то приходится изгалятся
(3) Eugeneer за это пост хочется поставить сразу и + и -
я за критику, но с конкретикой хочется понять по каким критерия оценивается запрос :idea:
11. Алексей Константинов (alexk-is) 16.05.10 08:02
(9) Расклад такой на 1000 повторов для 3х вариантов:
1. Пример запроса из этой публикации
2. Пример запроса из ссылки (1)
3. Пример запроса из ссылки (1) с ограничениями на 2.5 года как в этой публикации

Период 1 месяц
1 - 5,891
2 - 6,172
3 - 3,391

Период 3 месяца
1 - 6,001
2 - 6,720
3 - 3,688

Период 6 месяцев
1 - 6,077
2 - 7,452
3 - 4,094

Период 12 месяц
1 - 6,173
2 - 8,923
3 - 4,938

Отсюда вывод запрос на 2739 лет (вариант 2) работает медленнее всех. Думаю это понятно, т.к. обрабатывается больше связей. Вариант 3 работает быстрее варианта 1, т.к. выполняется отсечение до соединения и меньше математики в результирующем запросе.
12. Алексей Константинов (alexk-is) 17.05.10 16:12
(0) Текст запроса в статье можно раскрасить получше.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа