Получить временные интервалы

1. andreysc 14 21.01.25 10:33 Сейчас в теме
Всем привет.
Выручайте, голова уже перестала думать. Есть табличка с графиком работы сотрудников (см.рисунок) в течении дня по разному интервалу времени. Можно ли запросом, либо как то еще получить таблицу с интервалами-пересечениями по времени между сотрудниками? (см.рисунок). Время в табличке может быть не округлено до часа.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
7. Vlan 36 21.01.25 14:54 Сейчас в теме
Я данные из таблицы значений беру. Вот такой запрос получился.
ВЫБРАТЬ
	ТЗ.НачСмены КАК НачСмены,
	ТЗ.КонСмены КАК КонСмены,
	ТЗ.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_ТабЗнач
ИЗ
	&ТабЗнач КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТЗ.НачСмены КАК Период
ПОМЕСТИТЬ ВТ_Периоды
ИЗ
	ВТ_ТабЗнач КАК ТЗ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ТЗ.КонСмены
ИЗ
	ВТ_ТабЗнач КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Периоды.Период КАК ПериодНач,
	МИНИМУМ(ВТ_ПериодыКон.Период) КАК ПериодКон
ПОМЕСТИТЬ ВТ_Интервалы
ИЗ
	ВТ_Периоды КАК ВТ_Периоды
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Периоды КАК ВТ_ПериодыКон
		ПО (ИСТИНА)
ГДЕ
	ВТ_Периоды.Период < ВТ_ПериодыКон.Период

СГРУППИРОВАТЬ ПО
	ВТ_Периоды.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Интервалы.ПериодНач КАК ПериодНач,
	ВТ_Интервалы.ПериодКон КАК ПериодКон,
	ТЗ.Сотрудник КАК Сотрудник
ИЗ
	ВТ_Интервалы КАК ВТ_Интервалы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТабЗнач КАК ТЗ
		ПО (ДОБАВИТЬКДАТЕ(ВТ_Интервалы.ПериодНач, СЕКУНДА, 1) МЕЖДУ ТЗ.НачСмены И ТЗ.КонСмены
				ИЛИ ДОБАВИТЬКДАТЕ(ВТ_Интервалы.ПериодКон, СЕКУНДА, -1) МЕЖДУ ТЗ.НачСмены И ТЗ.КонСмены)

УПОРЯДОЧИТЬ ПО
	ПериодНач
ИТОГИ ПО
	ПериодНач
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Said-We 21.01.25 10:39 Сейчас в теме
(1) Задач решается в два этапа.
1. Получить таблицу периодов. Для этого дата начала и дата окончания в одну колонку через объединение и свернуть. Далее полученную таблицу саму с собой соединить и получить периоды.
2. К полученной таблице прицепить исходную таблицу по пересечению периодов. Результат сформировать с колонкой ФИО в строчку в СКД.
3. andreysc 14 21.01.25 11:43 Сейчас в теме
(2) Ок. Через объединение сделал в одну колонку и свернул.

"Далее полученную таблицу саму с собой соединить и получить периоды." - получаются одинаковые периоды. С 10 до 10, с 11 до 11 (((( Может я как то не так понял?
4. andreysc 14 21.01.25 12:25 Сейчас в теме
(2) так, первый варик сделал. Ща буду пункт 2 реализовывать.
5. Vlan 36 21.01.25 14:18 Сейчас в теме
(4) Тоже попробовал сделать запрос. Чтобы получить результат, как в таблице из шапки, пришлось периоды смещать на секунду. Иначе пересекаются гораздо больше значений
6. andreysc 14 21.01.25 14:52 Сейчас в теме
(5) у меня вторая часть так и не получается, циклами наколхозил но все равно остаются лишние периоды, если получилось - какой запрос в итоге по второй части? секунды как раз не имеют смысла
10. andreysc 14 21.01.25 15:19 Сейчас в теме
(2) Спасибо огромное за помощь. 2 пункт так и не понял как запросом сделать, по пересечению времени первый раз столкнулся.
7. Vlan 36 21.01.25 14:54 Сейчас в теме
Я данные из таблицы значений беру. Вот такой запрос получился.
ВЫБРАТЬ
	ТЗ.НачСмены КАК НачСмены,
	ТЗ.КонСмены КАК КонСмены,
	ТЗ.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_ТабЗнач
ИЗ
	&ТабЗнач КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТЗ.НачСмены КАК Период
ПОМЕСТИТЬ ВТ_Периоды
ИЗ
	ВТ_ТабЗнач КАК ТЗ

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	ТЗ.КонСмены
ИЗ
	ВТ_ТабЗнач КАК ТЗ
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Периоды.Период КАК ПериодНач,
	МИНИМУМ(ВТ_ПериодыКон.Период) КАК ПериодКон
ПОМЕСТИТЬ ВТ_Интервалы
ИЗ
	ВТ_Периоды КАК ВТ_Периоды
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Периоды КАК ВТ_ПериодыКон
		ПО (ИСТИНА)
ГДЕ
	ВТ_Периоды.Период < ВТ_ПериодыКон.Период

СГРУППИРОВАТЬ ПО
	ВТ_Периоды.Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТ_Интервалы.ПериодНач КАК ПериодНач,
	ВТ_Интервалы.ПериодКон КАК ПериодКон,
	ТЗ.Сотрудник КАК Сотрудник
ИЗ
	ВТ_Интервалы КАК ВТ_Интервалы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ТабЗнач КАК ТЗ
		ПО (ДОБАВИТЬКДАТЕ(ВТ_Интервалы.ПериодНач, СЕКУНДА, 1) МЕЖДУ ТЗ.НачСмены И ТЗ.КонСмены
				ИЛИ ДОБАВИТЬКДАТЕ(ВТ_Интервалы.ПериодКон, СЕКУНДА, -1) МЕЖДУ ТЗ.НачСмены И ТЗ.КонСмены)

УПОРЯДОЧИТЬ ПО
	ПериодНач
ИТОГИ ПО
	ПериодНач
Показать
8. andreysc 14 21.01.25 15:11 Сейчас в теме
(7) Огромное спасибо. Всю голову себе сломал. Я теперь должник)))))
9. Vlan 36 21.01.25 15:18 Сейчас в теме
(8) Это Said-We благодари. Я по его алгоритму делал.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот