| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > операция с полем типа "дата" |
| Автор: Aazmandius 6.9.2006, 18:28 |
| Помогите пожалуйста с запросом: есть поле типа дата, там хранятся дни рождения людей, диапазон дат - от 1900 до наших дней, необходимо выбрать поля, день в которых находится в пределах плюс-минус N дней от текущего (месяц учитывается), невзирая на год.(То есть найти людей, у которых день рождения находится в этих пределах на текущий момент). Можно ли это проделать средствами MySQL без сторонних извращений со стороны приложения одним запросом? Заранее спасибо! |
| Автор: muzer 6.9.2006, 20:07 | ||||
| Из того что придумалось: 1.У данного способа есть погрешность плюс минус один день из-за високосных годов.
2.
Оба варианта не быстрые, т.к. невозможно использовать индекс. |
| Автор: Aazmandius 7.9.2006, 19:13 |
| Спасибо =) |
| Автор: muzer 7.9.2006, 20:12 | ||||
| Эмм..фигню я сказал какую-то.. Проблемы же будут в новый год, точнее всегда, когда даты начала и конца периода будут стоять в разных годах. Придумал запрос, который решает эту проблему. Но будь я на вашем месте - использовал бы другой способ. Идея такая: если конец и начало периода стоят в разных годах, то дни рождения первого полугодия ставим выше дней рождений второго полугодия путём прибавления к датам первого полугодия числа 20000, а к датам второго полугодия числа 10000 (чтобы сохранить порядок чисел). К началу периода прибавляем 10000 с той же целью. К концу периода прибавляем 20000, т.к. он должен быть выше начала периода. Проверял, работает
Но это всё было проделано мной из спортивного интереса. Правильное решение на мой взгляд - сгенерить массив дат (месяц-день) за которые надо вывести дни рождения, а потом выполнить запрос
|
| Автор: Aazmandius 8.9.2006, 15:25 | ||
Есть еще один способ, недавно придуман =) Суть в том, что мы заменяем все годы, попавшие в выборку, на текущий, и сравниваем с текущей датой, получим как раз искомое значение.
где curYear, begDate, endDate - текущий год, нчало и конец диапазона соответственно. Просто и быстро =) |
| Автор: muzer 8.9.2006, 16:35 |
| Да нет же.. Та же проблема, если у нас начало период 2005-12-15 а конец 2006-01-15 Ваш запрос работать не будет. В этом вся и проблема |
| Автор: Aazmandius 8.9.2006, 18:41 |
| Мда, точно =) как то сразу не подумал... |