|
Свертка интервалов дат в запросе | ☑ | ||
---|---|---|---|---|
0
eandrs
15.10.11
✎
13:04
|
Суть проблемы такова: имеется таблица интервалов дат с двумя полями, условно - НачалоПериода, КонецПериода. Интервалы могут пересекаться, а могут и нет. Необходимо максимально возможно свернуть пересекающиеся интервалы. Вопрос.... Такое возможно сделать запросом? И если да - то как?
|
|||
1
Renat11111
15.10.11
✎
13:14
|
Запрос к таблице значений и выбрать Максимум(КонецПериода) и Минимум(НачалоПериода) или не так понял?
|
|||
2
eandrs
15.10.11
✎
13:18
|
На примере поясню. Интервалы
10.01.2011 - 13.01.2011 12.01.2011 - 18.01.2011 15.01.2011 - 22.01.2011 25.01.2011 - 27.01.2011 Желаемый результат - 10.01.2011 - 22.01.2011 25.01.2011 - 27.01.2011 |
|||
3
Renat11111
15.10.11
✎
13:27
|
(2) В принципе ничего не меняеть просто лень самому экспериментировать... Выбрать Максимум(КонецПериода) и Минимум(НачалоПериода) + После где придумать подходящее условие.
|
|||
4
eandrs
15.10.11
✎
13:34
|
Что-то мне подсказывает, что без соединений здесь не обойтись... Причём будет оно ни разу не одно.
|
|||
5
eandrs
15.10.11
✎
13:55
|
В-общем - вопрос закрыт. Запросом это сделать можно, но с некоторым извратом.
|
|||
6
kuza2000
15.10.11
✎
15:28
|
Кстати, возможно мне предстоит делать примерно то же. Правда, время до минут и нужно узнать сумму длительностей интервалов в указанный период. Что то мне думается, что надо покопать в направлении регистров расчетов...
|
|||
7
kuza2000
15.10.11
✎
15:29
|
(5) А какое решение было найдено, если не секрет?
|
|||
8
Мимохожий Однако
15.10.11
✎
15:32
|
(5)колись, родимый.
|
|||
9
eandrs
17.10.11
✎
15:47
|
Решение-то есть. Только оно ни-разу не быстрое, ибо использует туеву хучу соединений и группировок. Нужно пять раз подумать, прежде чем его использовать. Готового кода пока нет. Могу лишь словестно описать суть. На конкретном примере.
Интервалы: Начало Конец 10.01.2011 - 13.01.2011 12.01.2011 - 18.01.2011 15.01.2011 - 22.01.2011 16.01.2011 - 21.01.2011 25.01.2011 - 27.01.2011 26.01.2011 - 30.01.2011 Шаг первый: Делаем левое соединение этой таблицы с самой собой (условие - полное попадание интервала из левой таблицы в интервал правой), в качестве новых границ берем границы правой таблицы, если возможно, после чего группируем по всем полям/ выбрать различные. Получаем: Начало Конец 10.01.2011 - 13.01.2011 12.01.2011 - 18.01.2011 15.01.2011 - 22.01.2011 25.01.2011 - 27.01.2011 26.01.2011 - 30.01.2011 Шаг второй Ещё одно левое соединение полученной с самой собой (строки левой таблицы соединяем с предыдущими по номеру строками правой таблицы). Вычисляем дополнительное поле ЕстьПересечение (если есть пересечений периодов Истина, если нет пересечения, или период первый - Ложь). Получаем: Начало Конец ЕстьПересечение 10.01.2011 - 13.01.2011 Ложь 12.01.2011 - 18.01.2011 Истина 15.01.2011 - 22.01.2011 Истина 25.01.2011 - 27.01.2011 Ложь 26.01.2011 - 30.01.2011 Истина Шаг третий: Формируем промежуточную таблицу "новых границ" - отбираем из сформированной на предыдущем шаге таблице записи с ЕстьПересечение = Ложь. Получаем: НачалоПериодаДляСреза 10.01.2011 25.01.2011 Шаг четвертый Ещё одно левое соединение полученной на шаге 2 с таблицей из шага 3 с последующей группировкой (для каждой записи таблицы из шага 2 - выполняем псевдосрез последних). Получаем: Начало Конец НачалоПериодаДляСреза 10.01.2011 - 13.01.2011 10.01.2011 12.01.2011 - 18.01.2011 10.01.2011 15.01.2011 - 22.01.2011 10.01.2011 25.01.2011 - 27.01.2011 25.01.2011 26.01.2011 - 30.01.2011 25.01.2011 В качестве новой даты начала берем дату из псевдосреза. Получаем: Начало Конец 10.01.2011 - 13.01.2011 10.01.2011 - 18.01.2011 10.01.2011 - 22.01.2011 25.01.2011 - 27.01.2011 25.01.2011 - 30.01.2011 Накатываем итоговую группировку по началу периода и максимум от конца периода, получаем счастье. Чувствую себя извращенцем. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |