Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Проверка интервалов дат на пересечение


Автор: Gekt0r 1.2.2010, 12:34
Всем привет!
Что-то я второй день туплю, надеюсь на помощь...
Задача следующая.

Есть база, из которой надо сделать выборку.
Фишка в том, что запросы в базу будут отличаться, если выборка затрагивает время с 24 декабря по 11 января или остальной период года.
На вход принимаем 2 даты - начальную и конечную, по которым будем запрашивать данные.

Надо проверить тот интервал, который идет на вход.
Я так понимаю, могут быть следующие условия.

Соответственно, если нет пересечений с периодом 24.12 - 11.01, то запрос один.
Если интервал целиком внутри периода, то запрос другой.
Если есть пересечение, то надо разбить на 2 запроса.
Если период 24.12 - 11.01 оказывается целиком внутри заданного интервала, то разбиваем на 3 запроса (начальная дата - 23.12, 24.12 - 11.01, 12.01 - конечная дата)

что-то я у меня не придумывается, как это можно сделать, можете подсказать?

Автор: Akina 1.2.2010, 12:45
Поскольку количество ЗАПРОСОВ отличается - задача решается на клиенте, а не на сервере.

Автор: Gekt0r 1.2.2010, 12:54
Цитата(Akina @ 1.2.2010,  12:45)
Поскольку количество ЗАПРОСОВ отличается - задача решается на клиенте, а не на сервере.

Может, я что-то не так объясняю... Я имел в виду количество запросов в базу данных.
Клиент просто указывает интервал дат. Который потом надо обработать именно на сервере

Автор: Akina 1.2.2010, 14:31
Ааа... в таком случае пиши хранимку, которая всё это распарсит и просчитает.


Автор: Gekt0r 1.2.2010, 14:39
Цитата(Akina @ 1.2.2010,  14:31)
Ааа... в таком случае пиши хранимку, которая всё это распарсит и просчитает.

что написать, я не понял?
Если б знал, как написать, я бы тут тему не создавал)

Автор: Earnest 1.2.2010, 14:43
Akina имел в виду хранимую процедуру. Про них почитай документацию к своей БД. 

Автор: Gekt0r 1.2.2010, 15:02
Блин, я же говорю... Если бы я знал, как это написать, то я бы не задавал тут вопроса!
Мне сам алгоритм непонятен.. Особенно момент, когда период оказывается внутри заданного интервала

Автор: Akina 1.2.2010, 15:32
Цитата(Gekt0r @  1.2.2010,  16:02 Найти цитируемый пост)
Если бы я знал, как это написать, то я бы не задавал тут вопроса!

Я не понял - что тебе неясно? Даны два интервала, найти тип их пересечения... геометрию в школе все проходили - нарисуй. Факт пересечения проверяется просто (конец2-начало1)*(конец1-начало2)<0. Тип пересечения определяется проверкой попадания точки начала/конца одного диапазона внутри другого, при попадании (точка-начало)*(точка-конец)<0. Раз хранимая процедура - не жадничай поначалу на ветвления, всё равно работать будет только одна ветка. Потом займёшься оптимизацией.
А как пишут хранимки в твоём диалекте и как из них возвращать наборы записей - это в доки по своей СУБД.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)