Ежемесячный SQL-запрос о дне рождения

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

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

почему это не работает для mysql? наверняка у них есть эквивалент datepart ()?

Jeremy Cantrell 22.09.2008 06:36

EXTRACT, похоже, делает то, что, как я предполагаю, делает datepart (). например: ВЫБРАТЬ ВЫДЕРЖКУ (день ИЗ myDate). Однако для каждой части есть отдельные функции (день (), месяц (), год () и т. д.).

nickf 22.09.2008 06:39
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
9 139
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Лично я бы использовал 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

gregmac 22.09.2008 06:43

ну в этом случае отрегулируйте соответственно.

nickf 22.09.2008 06:44

Приятно :-) Такую мудрость можно получить только на собственном опыте :-)

Alex Weinstein 22.09.2008 08:00

Очень хорошее решение, но разве эти функции даты не замедлят выполнение запроса в большом наборе данных? Может быть лучше использовать> = @first day of_this_month AND <= @last_day_of_this_month

enobrev 22.09.2008 19:23

да, этот ответ на самом деле не отвечает на вопрос, который касался МЕСЯЦЕВ рождения, а не ДНЕЙ рождения. Я понял это только потом. Другие ответившие читали вопрос немного внимательнее, чем я ...

nickf 23.09.2008 03:15

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

Итак, я бы добавил столбец месяца рождения (проиндексированный) и просто сделал (с возможными 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)

Это можно использовать для получения приближающегося дня рождения по дням.

Другие вопросы по теме