|
Составить запрос | ☑ | ||
---|---|---|---|---|
0
red14_88
05.10.12
✎
17:29
|
Народ, не могу, составить запрос, просто мозг сломал - мб такое и невозможно. Короче есть таблица (табличная часть, регистр сведений - не суть). В ней три поля - id, датаначала и датаокончания.
Как сотавить запрос, чтобы выдал свободные интервалы? Например, есть записи id = 1 01/09/12 10/09/12 id = 2 08/09/12 12/09/12 id = 3 15/09/12 20/09/12 надо получить 12/09/12 15/09/12 Help,please! p.s. Хочу все это нафигачить в запросе, а не в коде. Спасибо! |
|||
1
Конфигуратор1с
05.10.12
✎
17:30
|
(0)Как нафигачишь - поделишься )))
|
|||
2
Нууф-Нууф
05.10.12
✎
17:31
|
соединяй с производственным календарем, и для каждого дня выставляй флаг вхождения в период. потом группировка с максимум по флагу
|
|||
3
red14_88
05.10.12
✎
17:35
|
(2) в конфе нет календаря. разбирать каждый день по отдельности не интересно.
(1) написать бы сначала |
|||
4
IronDemon
05.10.12
✎
17:38
|
Книга знаний: v8: Полные остатки по периоду во вложенном запросе
Ничего страшного, вот все даты без калеендаря. |
|||
5
Deon
05.10.12
✎
17:41
|
Таак, ну по-любасу, интервалы могут начинаться только там, где заканчиваются представленные в табличке, и соответственно заканчиваться большей датой начала. Т.е. получится как-то так:
10.09 - 15.09 12.09 - 15.09 Теперь отсюда надо выкинуть интервалы, которые пересекаются с другими периодами. Вооот как-то так |
|||
6
lucifer
05.10.12
✎
17:58
|
(0) т.е. тебе надо вытащить те записи у которых разнмца между датой окончания и датой начала (любых из существующих записей) больше 0 ?
|
|||
7
lucifer
05.10.12
✎
17:58
|
(6) *разница
|
|||
8
hhhh
05.10.12
✎
17:59
|
(3) ну как-то так
Выбрать Таб1.ДатаОкончания КАК НачалоИнтервала, Таб2.ДатаНачала КАК КонецИнтервала ИЗ Таб КАК Таб1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таб КАК Таб2 ПО Таб1.id + 1 = Таб2.id И Таб1.ДатаОкончания <= Таб2.ДатаНачала |
|||
9
sapphire
05.10.12
✎
18:07
|
//id, датаначала датаокончания
//id = 1 01/09/12 10/09/12 //id = 2 08/09/12 12/09/12 //id = 3 15/09/12 20/09/12 // иммитируем таблицу SELECT 1 id ,ДатаВремя(2012,09,01) ДатаНачала ,ДатаВремя(2012,09,10) ДатаОкончания INTO Интервалы UNION ALL SELECT 2 id ,ДатаВремя(2012,09,08) ДатаНачала ,ДатаВремя(2012,09,12) ДатаОкончания UNION ALL SELECT 3 id ,ДатаВремя(2012,09,15) ДатаНачала ,ДатаВремя(2012,09,20) ДатаОкончания ; // Строим шкалу дат SELECT ДатаНачала Дата INTO Даты FROM Интервалы UNION ALL SELECT ДатаОкончания Дата FROM Интервалы t0 ; // Получаем отрезки времени SELECT t0.Дата ДатаНачала ,MIN(t1.Дата) ДатаОкончания INTO ДискретныеИнтервалы FROM Даты t0 INNER JOIN Даты t1 ON t0.Дата<t1.Дата GROUP BY t0.Дата ; // Выберем те отрезки, которые не попадаю ни в один интервал SELECT ДискретныеИнтервалы.* FROM ДискретныеИнтервалы LEFT JOIN Интервалы ON Интервалы.ДатаНачала<=ДискретныеИнтервалы.ДатаНачала AND ДискретныеИнтервалы.ДатаОкончания<=Интервалы.ДатаОкончания WHERE Интервалы.ДатаНачала IS NULL |
|||
10
red14_88
08.10.12
✎
10:01
|
самое оно (8), ну и в (9) примерно та же мысль, если я верно понял, только id это ссылочный тип, плюс адин не пройдёт, а писать select 1 id... как в (9) при тысячах записей я себе не представляю как. Или есть хитрый способ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |