Ежемесячный SQL-запрос на день рождения - PullRequest
1 голос
/ 22 сентября 2008

Как получить все дни рождения клиентов за данный месяц в SQL? Как насчет MySQL? Я думал об использовании следующего с сервером SQL.

select c.name   
from cust c
where  datename(m,c.birthdate) = datename(m,@suppliedDate)
order by c.name

Ответы [ 4 ]

5 голосов
/ 22 сентября 2008

не забудь 29 февраля ...

SELECT c.name
FROM cust c
WHERE (
    MONTH(c.birthdate) = MONTH(@suppliedDate)
    AND DAY(c.birthdate) = DAY(@suppliedDate)
) OR (
    MONTH(c.birthdate) = 2 AND DAY(c.birthdate) = 29
    AND MONTH(@suppliedDate) = 3 AND DAY(@suppliedDate) = 1
    AND (YEAR(@suppliedDate) % 4 = 0) AND ((YEAR(@suppliedDate) % 100 != 0) OR (YEAR(@suppliedDate) % 400 = 0))
)
2 голосов
/ 22 сентября 2008

Если вы запрашиваете все дни рождения в данном месяце , то вы должны указать месяц , а не дату :

SELECT c.name
FROM   cust c
WHERE  datepart(m,c.birthdate) = @SuppliedMonth
2 голосов
/ 22 сентября 2008

Лично я бы использовал DATEPART вместо DATENAME, поскольку DATENAME открыта для интерпретации в зависимости от локали.

1 голос
/ 22 сентября 2008

Я действительно хотел бы добавить столбец при рождении, если вы ожидаете, что список клиентов станет очень большим. Пока что запросы, которые я видел (включая пример), потребуют полного сканирования таблицы, поскольку вы передаете столбец данных в функцию и сравниваете ее. Если таблица имеет любой размер, это может занять достаточно много времени, поскольку никакой индекс не сможет помочь.

Итак, я бы добавил столбец при рождении (проиндексированный) и просто сделал (с возможными MySQLisms):

SELECT name
FROM  cust
WHERE birthmonth = MONTH(NOW())
ORDER BY name;

Конечно, должно быть легко установить столбец Birthmonth либо с помощью триггера, либо с вашим клиентским кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...