![]() |
|
Модераторы: skyboy |
![]()
|
|
| Aazmandius |
|
|||
|
O_o ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: нет Всего: 6 |
Помогите пожалуйста с запросом:
есть поле типа дата, там хранятся дни рождения людей, диапазон дат - от 1900 до наших дней, необходимо выбрать поля, день в которых находится в пределах плюс-минус N дней от текущего (месяц учитывается), невзирая на год.(То есть найти людей, у которых день рождения находится в этих пределах на текущий момент). Можно ли это проделать средствами MySQL без сторонних извращений со стороны приложения одним запросом? Заранее спасибо! |
|||
|
||||
| muzer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Из того что придумалось:
1.У данного способа есть погрешность плюс минус один день из-за високосных годов.
2.
Оба варианта не быстрые, т.к. невозможно использовать индекс. |
||||
|
|||||
| Aazmandius |
|
|||
|
O_o ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: нет Всего: 6 |
Спасибо =)
|
|||
|
||||
| muzer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Эмм..фигню я сказал какую-то..
Проблемы же будут в новый год, точнее всегда, когда даты начала и конца периода будут стоять в разных годах. Придумал запрос, который решает эту проблему. Но будь я на вашем месте - использовал бы другой способ. Идея такая: если конец и начало периода стоят в разных годах, то дни рождения первого полугодия ставим выше дней рождений второго полугодия путём прибавления к датам первого полугодия числа 20000, а к датам второго полугодия числа 10000 (чтобы сохранить порядок чисел). К началу периода прибавляем 10000 с той же целью. К концу периода прибавляем 20000, т.к. он должен быть выше начала периода. Проверял, работает
Но это всё было проделано мной из спортивного интереса. Правильное решение на мой взгляд - сгенерить массив дат (месяц-день) за которые надо вывести дни рождения, а потом выполнить запрос
|
||||
|
|||||
| Aazmandius |
|
|||
|
O_o ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: нет Всего: 6 |
Есть еще один способ, недавно придуман =) Суть в том, что мы заменяем все годы, попавшие в выборку, на текущий, и сравниваем с текущей датой, получим как раз искомое значение.
где curYear, begDate, endDate - текущий год, нчало и конец диапазона соответственно. Просто и быстро =) |
|||
|
||||
| muzer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 387 Регистрация: 31.8.2006 Репутация: 30 Всего: 31 |
Да нет же..
Та же проблема, если у нас начало период 2005-12-15 а конец 2006-01-15 Ваш запрос работать не будет. В этом вся и проблема Это сообщение отредактировал(а) muzer - 8.9.2006, 16:47 |
|||
|
||||
| Aazmandius |
|
|||
|
O_o ![]() Профиль Группа: Участник Сообщений: 135 Регистрация: 29.4.2006 Где: Vancouver Репутация: нет Всего: 6 |
Мда, точно =) как то сразу не подумал...
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |