Как отфильтровать записи людей, у которых есть день рождения между двумя датами на основе их дня рождения, используя Firebird?
Я хотел бы опросить в моей базе данных людей, у которых есть день рождения между начальной и конечной датой. Поле хранится с датой в базе данных, поэтому ему нужно будет выбрать сервер без учета года. Я пытался использовать функции, такие как извлечение, чтобы получить день и месяц, но когда начальный день больше, чем последний день, запись не отображается. У кого-нибудь есть решение для этого без хранимой процедуры?
1 ответ
Если вы хотите игнорировать год, вам нужно извлечь месяцы и дни и сравнить отдельно:
- месяц - начальный месяц, а день равен или больше, чем начальный день.
- месяц больше начального месяца и меньше конечного месяца
- месяц - конец месяца, а дни меньше или равны концу дня
Это даст вам этот запрос:
select *
from (
select
extract(month from people.birthdate) as birthmonth,
extract(day from people.birthdate) as birthday,
*
from people) a
where a.birthmonth = :startmonth and a.birthday >= :startday
or a.birthmonth > :startmonth and a.birthmonth < :endmonth
or a.birthmonth = :endmonth and a.birthday <= :endday
Обратите внимание, что я использовал именованные параметры для ясности, даже если у самого Firebird их нет. Вам нужно будет заменить это позиционными параметрами, если только ваша библиотека подключений не может сделать это за вас.
Если вы хотите указать фактическую дату начала и окончания в качестве параметра, то вам может потребоваться выполнить дополнительную работу.