Вернуть данные, чей день рождения сегодня

Я пытаюсь установить запрос, который потянет всех клиентов, чей день рождения сегодня. я использую phpmyadminlocalhost с помощью Unix socketдень рождения установлен как DATE,

Все, что мне нужно, это возвращение firstname (emp.emp_firstname asимя), lastname (emp.emp_lastname asФамилия) а также date of birth (emp_birthday as 'dob')

5 ответов

Решение

Простое решение будет выглядеть так:

SELECT
  emp_firstname AS first_name,
  emp_lastname AS last_name,
  emp_birthday AS dob
FROM
  emp
WHERE
  MONTH(emp_birthday)=MONTH(CURDATE())
  AND DAY(emp_birthday)=DAY(CURDATE())

или если вы хотите учесть также високосные годы, вы можете использовать это:

SELECT
  emp_firstname AS first_name,
  emp_lastname AS last_name,
  emp_birthday AS dob
FROM
  emp
WHERE
  emp_birthday +
    INTERVAL
      YEAR(CURDATE())-YEAR(emp_birthday) +
      (MONTH(emp_birthday)<MONTH(CURDATE())
       OR (MONTH(emp_birthday)=MONTH(CURDATE()) AND DAY(emp_birthday)<DAY(CURDATE())))
    YEAR = CURDATE()

Если чья-то дата рождения 29 февраля, а сегодня 28 февраля и этот год не високосный, мой последний запрос будет считать его / ее день рождения сегодняшним днем.

Мой второй запрос также может быть упрощен следующим образом:

SELECT
  emp_firstname AS first_name,
  emp_lastname AS last_name,
  emp_birthday AS dob
FROM
  emp
WHERE
  (MONTH(emp_birthday)=MONTH(CURDATE())
  AND DAY(emp_birthday)=DAY(CURDATE()))
  OR (DAY(LAST_DAY(emp_birthday))=29
      AND DAY(emp_birthday)=29
      AND DAY(LAST_DAY(CURDATE()))=28);
select emp_firstname as first_name, 
       emp_lastname as last_name, 
       emp_birthday as dob
from emp
where month(emp_birthday) = month(curdate())
and  day(emp_birthday) = day(curdate())

SQLFiddle demo

select emp_firstname as first_name, 
       emp_lastname as last_name, 
       emp_birthday as dob
from emp
where DATE_FORMAT(emp_birthday,'%m-%d') = DATE_FORMAT(NOW(),'%m-%d')

Извините, но почему бы не просто

SELECT 
    emp_firstname AS first_name, 
    emp_lastname AS last_name, 
    emp_birthday AS dob
FROM rmp
WHERE DATE(emp_birthday) = CURDATE();

?

Возможно, у вас возникла проблема с сопоставлением дат. Curdate() возвращает метку полуночи, но сами даты рождения могут не быть метками полуночи по причинам, которые трудно угадать. Попробуй это:

 SELECT emp_firstname AS first name, 
        emp_lastname  AS last name, 
        emp_birthday  AS dob
   FROM emp
  WHERE emp_birthday >= curdate()
    AND emp_birthday <  curdate() + INTERVAL 1 DAY
Другие вопросы по тегам