Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Порешаем задачки? Как в запросе разбить год на периоды из списка дат?

Порешаем задачки? Как в запросе разбить год на периоды из списка дат?
Я
   Vladal
 
10.10.16 - 11:26
Есть таблица с периодом 01.01.2016 -- 31.12.2016

|выбрать
|    датавремя(2016,01,01,0,0,0) как НачалоПериода,
|    датавремя(2016,12,31,0,0,0) как КонецПериода
|поместить втПериодГод

Есть таблица с датами начала периодов, например, такая:

|;выбрать
|    датавремя(2016,01,01,0,0,0) как РазделительПериодов
|поместить втРазделителиПериодов
|объединить все датавремя(2016,09,06,0,0,0)
|объединить все датавремя(2016,10,10,0,0,0)

Надо получить таблицу с разбивкой этого года по периодам:

|01.01.2016 -- 05.09.2016
|06.09.2016 -- 09.10.2016
|10.10.2016 -- 31.12.2016

Я сделал так: соединял начало периода из первой таблицы с датам из второй (-1 день), получилось так:

|Начало года   период    
|01.01.2016 -- 05.09.2016
|01.01.2016 -- 09.10.2016
|01.01.2016 -- 31.12.2016

А теперь надо добавить и начало следующего периода, а как - не пойму.
Подскажите, пожалуйста.
 
 
   Мойдодыр
 
1 - 10.10.16 - 11:29
так это же срез последних на каждую дату
   В тылу врага
 
2 - 10.10.16 - 11:30
МИНИМУМ
   Vladal
 
3 - 10.10.16 - 11:30
(1) ТИпа того, очень похоже.
   Vladal
 
4 - 10.10.16 - 11:31
(2) минимум выдает 1 января, а я хочу присобачить как начало периода предыдущую строку из той таблицы, откуда взял дату конца периода
   В тылу врага
 
5 - 10.10.16 - 11:32
(4) не тупи, все работает: группируем по началам, минимум по концам
   iceman2112
 
6 - 10.10.16 - 11:32
Левое соединение само с собой и группировка.
   Garykom
 
7 - 10.10.16 - 11:36
и никого не удивляет после таких "операций на гландах через задний проход автогеном" что типовые тормозят на крутом сервере?
   azernot
 
8 - 10.10.16 - 12:01
ВЫБРАТЬ
    ДАТАВРЕМЯ(2016, 1, 1, 0, 0, 0) КАК НачалоПериода,
    ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59) КАК КонецПериода
ПОМЕСТИТЬ втПериодГод
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДАТАВРЕМЯ(2016, 1, 1, 0, 0, 0) КАК РазделительПериодов
ПОМЕСТИТЬ втРазделителиПериодов

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

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ДАТАВРЕМЯ(2016, 9, 6, 0, 0, 0)

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

ВЫБРАТЬ
    ДАТАВРЕМЯ(2016, 10, 10, 0, 0, 0)
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ВсеПериоды.Период
ПОМЕСТИТЬ ВсеПериоды
ИЗ
    (ВЫБРАТЬ
        втПериодГод.НачалоПериода КАК Период
    ИЗ
        втПериодГод КАК втПериодГод
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ
        втПериодГод.КонецПериода
    ИЗ
        втПериодГод КАК втПериодГод
    
    ОБЪЕДИНИТЬ ВСЕ
    
    ВЫБРАТЬ РАЗЛИЧНЫЕ
        втРазделителиПериодов.РазделительПериодов
    ИЗ
        втРазделителиПериодов КАК втРазделителиПериодов) КАК ВсеПериоды
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    НачалоПериода(Периоды.НачалоПериода, День) КАК НачалоПериода,
    ВЫБОР
        КОГДА Периоды.КонецПериода = МаксимальныйПериод.Период
            ТОГДА Периоды.КонецПериода
        ИНАЧЕ КонецПериода(ДОБАВИТЬКДАТЕ(Периоды.КонецПериода, ДЕНЬ, -1), День)
    КОНЕЦ КАК КонецПериода
ИЗ
    (ВЫБРАТЬ
        ВсеПериоды.Период КАК НачалоПериода,
        МИНИМУМ(ВсеПериоды1.Период) КАК КонецПериода
    ИЗ
        ВсеПериоды КАК ВсеПериоды
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВсеПериоды КАК ВсеПериоды1
            ПО ВсеПериоды.Период < ВсеПериоды1.Период
    
    СГРУППИРОВАТЬ ПО
        ВсеПериоды.Период) КАК Периоды
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            МАКСИМУМ(ВсеПериоды.Период) КАК Период
        ИЗ
            ВсеПериоды КАК ВсеПериоды) КАК МаксимальныйПериод
        ПО (ИСТИНА)

УПОРЯДОЧИТЬ ПО
    НачалоПериода
   Vladal
 
9 - 10.10.16 - 13:16
(8) Чудесно! Спасибо!

Я понял эту идею - получить все даты и потом к ним добавить эту же таблицу и получить конец интервала периода.

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует