Оптимизация поиска по мясяцу, дню из поля даты

ElGato

Новичок
Оптимизация поиска по мясяцу, дню из поля даты

Есть таблица пользователей с полем типа дата, которое хранит дату рождения (DOB).
Нужно делать запросы выбирающие пользователей по знаку зодиака (то есть месяц и год).

Если сделать индекс по DOB, то это ни чего не решает. тк он не используется, когда пишу типа MONTH(DOB)=...

Напрашивается такой выход - сделать дополнительные поля DOMmonth DOBday (по этим полям сделать индексы) и обновлять их по триггеру, когда меняется дата. (или когда пользователь решит изменить свой DOB).

Вопрос такой: насколько разумно такое решение, может есть другое более правильное?

С другой стороный записей сейчас 4 000. Может fullscan не настолько критично при таких объёмах?
 

asm

Пофигист
ElGato
как вариант использовать int (unixtimestamp) вместо date
 

ElGato

Новичок
2hermit_refined
можно поле для зн зодиака завести. Но нужно еще кроме этого искать сегодняшние дни рождения.

2asm
а как из unixtimestamp можно получить месяц(год)? (чтобы индексы задействовались)
 

antson

Новичок
Партнер клуба
ElGato
преобразовается дата YYYY.MM.DD 00:00:00
преобразовывается YYYY.01.01 00:00:00
где YYYY.MM.DD - по дате рождения

разность заноситься в поле

ищется в дипазоне
NACHALO_GODA <= YYYY.01.01 00:00:00
Start <= YYYY.MM.DD 00:00:00 - NACHALO_GODA
End <= YYYY.MM.DD 23:59:59 - NACHALO_GODA

здесь YYYY.MM.DD - по сегодняшней дате

преобразование к юникстайм от всех дат подразумевается в выражениях

это у кого сегодня ДР.
со знаками зодиака формулы старта, енда напиши сам
 

hermit_refined

Отшельник
antson
угу, половина программистов живут в идеальном мире, в котором нет никакого летнего времени и високосных годов.

ElGato
и какие ещё вам выборки надо будет делать? и с какой сортировкой? весь список огласите ;-)

можете завести поле, в котором хранить день в году (например, порядковый номер в 366-дневном году, или месяц*100+день). а можете и два поля. или оставить как есть.
ибо оптимизация всех выборок требует немалого времени программиста, на 4.000 записей это не очень оправдано. если захотите - варианты перечислены, создавайте индексы с учетом сортировки, и explain вам в помощь.
 

antson

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

Кстати. А сами знаки зодиака както високосные года учитывают ?

-~{}~ 22.02.07 17:09:

совсем забыли про классную функцию самого мускула

DAYOFYEAR(date)
Returns the day of the year for date, in the range 1 to 366.

-~{}~ 22.02.07 17:16:

единственное нужно ее результат корректировать
c учетом когда дата больше равна 1 марта
с учетом високосности года которую можно проверить через
(DAYOFYEAR('YYYY-03-01') )-60
 
Сверху