Как получить в SQL дни рождения всех клиентов за данный месяц? А как насчет MySQL? Я думал об использовании следующего с SQL-сервером.
select c.name
from cust c
where datename(m,c.birthdate) = datename(m,@suppliedDate)
order by c.name
EXTRACT, похоже, делает то, что, как я предполагаю, делает datepart (). например: ВЫБРАТЬ ВЫДЕРЖКУ (день ИЗ myDate). Однако для каждой части есть отдельные функции (день (), месяц (), год () и т. д.).


Лично я бы использовал DATEPART вместо DATENAME, поскольку DATENAME может интерпретироваться в зависимости от локали.
не забудьте 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))
)
Официальный день рождения для человека, родившегося 29 февраля, на самом деле зависит от региона - [согласно Википедии] [1], например, в Англии это 28 февраля. [1]: en.wikipedia.org/wiki/Feb February_29#Births
ну в этом случае отрегулируйте соответственно.
Приятно :-) Такую мудрость можно получить только на собственном опыте :-)
Очень хорошее решение, но разве эти функции даты не замедлят выполнение запроса в большом наборе данных? Может быть лучше использовать> = @first day of_this_month AND <= @last_day_of_this_month
да, этот ответ на самом деле не отвечает на вопрос, который касался МЕСЯЦЕВ рождения, а не ДНЕЙ рождения. Я понял это только потом. Другие ответившие читали вопрос немного внимательнее, чем я ...
На самом деле я бы хотел добавить столбец месяца рождения, если вы ожидаете, что список клиентов станет очень большим. До сих пор для запросов, которые я видел (включая пример), требуется полное сканирование таблицы, поскольку вы передаете столбец данных в функцию и сравниваете их. Если таблица любого размера, это может занять изрядное количество времени, поскольку никакой индекс не поможет.
Итак, я бы добавил столбец месяца рождения (проиндексированный) и просто сделал (с возможными MySQLism):
SELECT name
FROM cust
WHERE birthmonth = MONTH(NOW())
ORDER BY name;
Конечно, установить столбец месяца рождения должно быть легко либо с помощью триггера, либо с помощью кода вашего клиента.
Если вы запрашиваете все дни рождения в данном месяц, вам следует указать месяц, а не Дата:
SELECT c.name
FROM cust c
WHERE datepart(m,c.birthdate) = @SuppliedMonth
SELECT * FROM tbl_Employee WHERE DATEADD( Year, DATEPART( Year, GETDATE()) - DATEPART( Year, DOB), DOB) BETWEEN CONVERT( DATE, GETDATE()) AND CONVERT( DATE, GETDATE() + 30)
Это можно использовать для получения приближающегося дня рождения по дням.
почему это не работает для mysql? наверняка у них есть эквивалент datepart ()?