Гуру-тест: Как получить все отрезки, пересекающий заданный.

1. fixin 4253 10.04.12 12:10 Сейчас в теме
Есть справочник периодов Периоды, с полями ДатаС, ДатаПо, обозначающими начало и конец периода (включая границы).
Нужно написать запрос, которая по заданному интервалу Дата1-Дата2 найдет все периоды, которые попадают в заданный.
Тут есть одна хитрость в формировании условия отбора, можно просто озвучить алгоритм отбора периодов, без уточнения в SQL-коде.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. spenser123 10.04.12 12:22 Сейчас в теме
Что то в духе
ВЫБРАТЬ
Периоды.ДатаС Как ДатаС,
Периоды.ДатаПо Как ДатаПо
ИЗ Справочники.Периоды(ДатаС МЕЖДУ &Дата1 И &Дата2, ДатаПо МЕЖДУ &Дата1 И &Дата2) Как Периоды
3. fixin 4253 10.04.12 12:31 Сейчас в теме
да, уточню, что пустая ДатаПо обозначает конец времен.
(2) не фига, ошибаешься.
4. Spi1y 10.04.12 13:11 Сейчас в теме
Целиком попадают, или пересечение тоже?
5. fixin 4253 10.04.12 13:27 Сейчас в теме
(4) хотя бы кусочком или концом попадают. ;-) то бишь те периоды, Которые пересекаются с заданным.
6. Spi1y 10.04.12 14:47 Сейчас в теме
Ну дык:

ГДЕ 
  ((ДатаС >= &Дата1)
    ИЛИ (ДатаПо >= &Дата1))
  И ((&Дата2 = &ПустаяДата)
    ИЛИ ((ДатаС <= &Дата2)
      ИЛИ (ДатаПо <= &Дата2)))
7. fixin 4253 10.04.12 15:09 Сейчас в теме
Не фига.
Вот этот код: ((ДатаС <= &Дата2) ИЛИ (ДатаПо <= &Дата2)))
покажет, что период 1-2 входит в заданный интервал 6-7.
Гонишь...
Хотя может и не гонишь, но тем не менее, есть способ проще.
8. Spi1y 10.04.12 15:21 Сейчас в теме
Первая половина условия

(ДатаС >= &Дата1)
    ИЛИ (ДатаПо >= &Дата1)


Так что кто еще гонит.
9. Spi1y 10.04.12 15:23 Сейчас в теме
Насчет проще - сомневаюсь, осообенно с учетом того, что задача поставлена как-то странно. Не указан случай с полным вхождением отрезка отбора в отрезок выборки.
Но, конечно, как и все, могу ошибаться.
10. fixin 4253 10.04.12 15:46 Сейчас в теме
(9) есть проще, есть... надо просто сломать шаблон.
Вы сейчас мыслите шаблонно, потому и условия сложные получаются.
Вам поставили задачу - найти отрезки, пересекающиеся с главным отрезком (выбранным периодом).
Вы ее и выполняете тупо в лоб.
А можно решить эту же задачу со стороны...

Если отрезок полностью входит внутрь искомого периода, то это тоже пересечение. Учитываем его тоже.
11. Uncore 1274 11.04.12 05:24 Сейчас в теме
может так:
ГДЕ
	Периоды.ДатаНачала <= &ДатаОкончания
	И (Периоды.ДатаОкончания >= &ДатаНачала
			ИЛИ Периоды.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
12. fixin 4253 11.04.12 11:02 Сейчас в теме
(11) а, блин, ты меня уел.
Я то немного другое условие юзал, но тоже короткое.
Исходил от обратного.
Если отрезок начинается после &ДатаОкончания или заканчивается до &ДатаНачала, то не подходит.
По сути это то же условие, но инвертированное. Если бы применил правила формальной логики, получил бы ваше условие.
Век живи, век учись. Спасибо!
13. luns 11.04.12 11:30 Сейчас в теме
(12) переименуй ветку в фиксин познает 1с :)
14. fixin 4253 11.04.12 11:46 Сейчас в теме
(13) не надо вандализма. Гуру-тест - это бренд
15. luns 11.04.12 11:52 Сейчас в теме
(14) халва, халва )))
большинство из твоих тестов либо просты либо без ответа от тебя же.

если что то назвать золотом, оно от этого им не станет.
16. fishca 1255 11.04.12 12:07 Сейчас в теме
Век живи, век учись. Спасибо!

не хочется, а придется признать НЕ Гений1С = Гуру
17. KapasMordorov 428 11.04.12 12:46 Сейчас в теме
(16)
Оба бренды хорошие, узнаваемые. Стоят в заголовке - ветку можно не читать.
18. fixin 4253 11.04.12 13:53 Сейчас в теме
(16) у вас проблема с формальной логикой. ;-)
Оставьте свое сообщение

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