в формате MM-DD, сначала пытался так:
to_char(birthday, 'MM-DD')
,но получил ошибку
functions in index expression must be marked IMMUTABLE
Как грамотнее всего поступить? В интернетах советуют написание пользовательской функции и вызывать ее вместо to_char, но, возможно, существует способ затайпкастить красиво?
А в чем суть такого преобразования - отрезать год?
а зачем вам индекс в таком формате? может "день с начала года" нужен?
Суть максимально простая — необходимость часто выбирать чуваков, у которых ДР через N дней или был N дней назад. Для этого мне как раз нужно отрезать год и искать примерно так: WHERE to_char(birthday, 'MM-DD') = '02-05'
extract(doy from birthdate) = extract (doy from desired_date) - не так?
А я бы оставлял дату как есть и проверял WHERE birthday = '02-05'::date синтаксис наверняка ошибочный, но идея, я думаю, понятна.
Високосный год не станет помехой?
надо потестить, возможно придётся учесть
SELECT substring(birthday::date::TEXT, 6, 6) Но я полагаю, что Вам нужен просто индекс по дате
Мне кажется, что если бы удалось поставить индекс по дню и месяцу, то было бы быстрее, чем просто индекс по дате
Насколько я помню весь софт, который ищет ДР, он ещё и возраст указывает. Т.е. год тоже используется.
Мой софт — это автоматизированный инструмент для маркетинговых кампаний. Одна из настроек этой кампании может выглядеть примерно как "отправь чувакам, у которых ДР был 3 дня назад, такое-то письмо"
А почему бы просто не хранить int в формате MMDD, например (полученный immutable function из birthdate), и то же самое использовать для запросов (раз нужно точное соответствие)?
Вот тут большое исслеедование 🙈🙈🙈 https://stackoverflow.com/questions/15169410/how-do-you-do-date-math-that-ignores-the-year
Спасибо большое. Реально вопрос оказался для меня интереснее, чем казалось исходно
Обсуждают сегодня