Имя: Пароль:
1C
1С v8
Составить запрос
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) при тысячах записей я себе не представляю как. Или есть хитрый способ?