Ниже буду приводить запросы по работе с временными интервалами. Изначально нижеприведенный способ по генерации временных промежутков подсмотрел где-то на инфостарте и теперь при необходимости его использую.
Получить таблицу интервалов периода в минутах
Параметр "Период" в запросе ниже - это количество минут в каждом интервале, на которые требуется разбить период
Текст запроса под спойлером
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачалоПериода, СЕКУНДА, (bb.b * 100 + cc.c * 10 + dd.d) * 3600) КАК Дата
ПОМЕСТИТЬ _0_Часы
ИЗ
(ВЫБРАТЬ
0 КАК b
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК bb
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК c
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК cc
ПО (ИСТИНА)
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК d
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК dd
ПО (ИСТИНА)
ГДЕ
bb.b * 100 + cc.c * 10 + dd.d <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ЧАС)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
bb.b * 100 + cc.c * 10 + dd.d КАК Число_
ПОМЕСТИТЬ _0_Числа
ИЗ
(ВЫБРАТЬ
0 КАК b
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК bb
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК c
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК cc
ПО (ИСТИНА)
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
0 КАК d
ОБЪЕДИНИТЬ
ВЫБРАТЬ
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
4
ОБЪЕДИНИТЬ
ВЫБРАТЬ
5
ОБЪЕДИНИТЬ
ВЫБРАТЬ
6
ОБЪЕДИНИТЬ
ВЫБРАТЬ
7
ОБЪЕДИНИТЬ
ВЫБРАТЬ
8
ОБЪЕДИНИТЬ
ВЫБРАТЬ
9) КАК dd
ПО (ИСТИНА)
ГДЕ
bb.b * 100 + cc.c * 10 + dd.d <= 60
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
НАЧАЛОПЕРИОДА(_0_Часы.Дата, ДЕНЬ) КАК День,
ЧАС(_0_Часы.Дата) КАК Час,
МИНУТА(ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, _0_Числа.Число_ * &Периодичность * 60)) КАК Минута,
ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, _0_Числа.Число_ * &Периодичность * 60) КАК НачалоМинут,
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, (_0_Числа.Число_ + 1) * &Периодичность * 60 - 1) < &КонецПериода
ТОГДА ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, (_0_Числа.Число_ + 1) * &Периодичность * 60 - 1)
ИНАЧЕ &КонецПериода
КОНЕЦ КАК КонецМинут
ИЗ
_0_Часы КАК _0_Часы
ЛЕВОЕ СОЕДИНЕНИЕ _0_Числа КАК _0_Числа
ПО (ЧАС(ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, _0_Числа.Число_ * &Периодичность * 60)) = ЧАС(_0_Часы.Дата))
ГДЕ
ДОБАВИТЬКДАТЕ(_0_Часы.Дата, СЕКУНДА, _0_Числа.Число_ * &Периодичность * 60) < &КонецПериода