2015-10-14 3 views
0

Так что я храню день рождения и месяц пользователя. Я отправляю им предложения на день рождения, и эти сделки истекают каждый раз в другом интервале, то есть «количество дней после их рождения».Postgres make_date handle exception

Я построил формулу успешно (ниже кусок от него), но я ушел с этой проблемой:

('2015-10-10'::date >= make_date(2015, users.birth_month, users.birth_day) ...

Если пользователь родился 29 февраля, make_date бы поднять исключение за недействительные годы (ERROR: date field value out of range: 2015-02-29)

Как я могу изящно справиться с этим? (У меня есть другие способы справиться с этим, но они требуют от меня специального лечения для високосных лет)

+0

Вы можете создать функцию, которая вызывает 'make_date() 'ловит любое исключение и затем возвращает' null' в этом случае –

+0

Как вы думаете, это повлияло бы на эффективность вообще? (по сравнению с моим решением ниже) – Abdo

ответ

0

Хорошо, я добавил специальный чехол, когда день рождения 02-29. Это решит мою проблему, но я бы полностью хотел услышать другие предложения.

('2015-10-10'::date >= 
    case when users.birth_month = 2 and users.birth_day = 29 make_date(2015,2, 28) 
     else make_date(2015, users.birth_month, users.birth_day) 
    end 
) 

Пользователь в этом случае потеряет день (я могу сделать их выиграть в день, делая марш 1-го), но вы получите точку =)