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

Запрос. Собираем периоды действия.

Да задача изначальна упрощена - меня интересуют непрерывные периоды действия в днях.

Превращаем таблицу вида

Дата
01.01.2015
02.01.2015
04.01.2015
05.01.2015
06.01.2015
12.01.2015

в таблицу

ДатаНачала ДатаОкончания
01.01.2015 02.01.2015
04.01.2015 06.01.2015
12.01.2015 12.01.2015



Главная хитрость/идея: сравнить разность дат (получаем все возможные периоды для исходного множества) границ периода и количества вхождений дат (элементов множества) в этот период

КОЛИЧЕСТВО(НАЧАЛОПЕРИОДА(втДаты.Дата, ДЕНЬ)) - 1 = РАЗНОСТЬДАТ(втВариации.ДатаНачала, втВариации.ДатаОкончания, ДЕНЬ)
 
Собственно текст запроса под катом


ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 1) КАК Дата
ПОМЕСТИТЬ втДаты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 2)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 4)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 5)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 6)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
 ДАТАВРЕМЯ(2015, 1, 12)
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 втДаты.Дата КАК ДатаНачала,
 ЕСТЬNULL(втДатыСправа.Дата, втДаты.Дата) КАК ДатаОкончания
ПОМЕСТИТЬ втВариации
ИЗ
 втДаты КАК втДаты
  ЛЕВОЕ СОЕДИНЕНИЕ втДаты КАК втДатыСправа
  ПО втДаты.Дата < втДатыСправа.Дата
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
 МИНИМУМ(НеСгруппированныеПериодыСправа.ДатаНачала) КАК ДатаНачала,
 НеСгруппированныеПериодыСправа.ДатаОкончания
ИЗ
 (ВЫБРАТЬ
  НеСгруппированныеПериодыСправа.ДатаНачала КАК ДатаНачала,
  МАКСИМУМ(НеСгруппированныеПериодыСправа.ДатаОкончания) КАК ДатаОкончания
 ИЗ
  (ВЫБРАТЬ
   втВариации.ДатаНачала КАК ДатаНачала,
   втВариации.ДатаОкончания КАК ДатаОкончания
  ИЗ
   втВариации КАК втВариации
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ втДаты КАК втДаты
    ПО втВариации.ДатаНачала <= втДаты.Дата
     И втВариации.ДатаОкончания >= втДаты.Дата
  
  СГРУППИРОВАТЬ ПО
   втВариации.ДатаНачала,
   втВариации.ДатаОкончания
  
  ИМЕЮЩИЕ
   КОЛИЧЕСТВО(НАЧАЛОПЕРИОДА(втДаты.Дата, ДЕНЬ)) - 1 = РАЗНОСТЬДАТ(втВариации.ДатаНачала, втВариации.ДатаОкончания, ДЕНЬ)) КАК НеСгруппированныеПериодыСправа
 
 СГРУППИРОВАТЬ ПО
  НеСгруппированныеПериодыСправа.ДатаНачала) КАК НеСгруппированныеПериодыСправа

СГРУППИРОВАТЬ ПО
 НеСгруппированныеПериодыСправа.ДатаОкончания

Комментарии

  1. ПО втДаты.Дата < втДатыСправа.Дата

    Тут надо поставить <=
    Иначе не будут попадать минимальные даты (например если после первого числа сразу не идёт второе).
    Такая например ВТ будет неправильно обрабатываться
    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 1) КАК Дата
    ПОМЕСТИТЬ втДаты

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 22)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 4)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 5)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 6)

    ОБЪЕДИНИТЬ ВСЕ

    ВЫБРАТЬ
    ДАТАВРЕМЯ(2015, 1, 12)
    ;

    ОтветитьУдалить

Отправить комментарий

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

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За...

Управляемые формы. Группа формы. Сворачиваемая и свойство Свернута

В конфигураторе в свойствах группы есть свойство "Свернута" не доступное через средства встроенного языка. И честно, уже не в первой вводит в ступор, чтобы не забывать, что и как Начиная с 8.3.12 введены следующие методы для программного управления поведением Версия 8.3.12 | Новые возможности и изменения | Управляемая форма Дальше фрагменты из Синтаксис помошника. Расширение группы формы для обычной группы Скрыть (Hide) Синтаксис: Скрыть() Описание: В зависимости от значения свойства Поведение группы: Обычное - никакие действия не выполняются, Свертываемая - сворачивает группу, Всплывающая - скрывает группу. Доступность: Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер). Скрыта (Hidden) Расширение группы формы для обычной группы (Form group extension for a usual group) Скрыта (Hidden) Синтаксис: Скрыта() Возвращае...