| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Алгоритмы > Проверка интервалов дат на пересечение |
| Автор: 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, 14:31 |
| Ааа... в таком случае пиши хранимку, которая всё это распарсит и просчитает. |
| Автор: Gekt0r 1.2.2010, 14:39 | ||
что написать, я не понял? Если б знал, как написать, я бы тут тему не создавал) |
| Автор: Earnest 1.2.2010, 14:43 |
| Akina имел в виду хранимую процедуру. Про них почитай документацию к своей БД. |
| Автор: Gekt0r 1.2.2010, 15:02 |
| Блин, я же говорю... Если бы я знал, как это написать, то я бы не задавал тут вопроса! Мне сам алгоритм непонятен.. Особенно момент, когда период оказывается внутри заданного интервала |
| Автор: Akina 1.2.2010, 15:32 |
Я не понял - что тебе неясно? Даны два интервала, найти тип их пересечения... геометрию в школе все проходили - нарисуй. Факт пересечения проверяется просто (конец2-начало1)*(конец1-начало2)<0. Тип пересечения определяется проверкой попадания точки начала/конца одного диапазона внутри другого, при попадании (точка-начало)*(точка-конец)<0. Раз хранимая процедура - не жадничай поначалу на ветвления, всё равно работать будет только одна ветка. Потом займёшься оптимизацией. А как пишут хранимки в твоём диалекте и как из них возвращать наборы записей - это в доки по своей СУБД. |