mysql - 从本周获得生日

vin*_*ent 2 mysql

我想找到所有在本周过生日的人.

例如,我们现在是星期二,所以我想要从昨天(星期一)到周日的所有生日.

我尝试了以下查询:

SELECT * FROM `employees` WHERE WEEK( birthdate ) = WEEK( NOW() )
Run Code Online (Sandbox Code Playgroud)

但这并没有给我正确的数据,因为我也记录了生日的地方1975-03-29,即下周而不是本周.

Pau*_*gel 6

您需要将年份差异添加到生日:

SELECT * 
FROM `employees` 
WHERE WEEK(NOW()) = WEEK( birthdate + INTERVAL (YEAR(NOW()) - YEAR(birthday)) YEAR )
Run Code Online (Sandbox Code Playgroud)

但这对于今年的第一周和最后一周来说是行不通的.因此,您需要计算星期一和星期日的日期.

今年生日:

SELECT e.*, birthdate + INTERVAL (YEAR(NOW()) - YEAR(birthdate)) YEAR
FROM employees e;
Run Code Online (Sandbox Code Playgroud)

星期一星期一:

SELECT DATE(now() - INTERVAL WEEKDAY(NOW()) DAY);
Run Code Online (Sandbox Code Playgroud)

本周日:

SELECT DATE(NOW() + INTERVAL 6 - WEEKDAY(NOW()) DAY);
Run Code Online (Sandbox Code Playgroud)

最终查询:

SELECT *
FROM employees
WHERE DATE(birthdate + INTERVAL (YEAR(NOW()) - YEAR(birthdate)) YEAR)
      BETWEEN
      DATE(NOW() - INTERVAL WEEKDAY(NOW()) DAY)
      AND
      DATE(NOW() + INTERVAL 6 - WEEKDAY(NOW()) DAY);
Run Code Online (Sandbox Code Playgroud)

演示:http://rextester.com/GCC50147

02/29仍有问题.此查询将"说"今年的生日是在02/28.虽然它可能应该是在03/01.要解决该问题,您可以使用以下"技巧":

SELECT e.*, birthdate - INTERVAL 1 DAY + INTERVAL (YEAR(NOW()) - YEAR(birthdate)) YEAR + INTERVAL 1 DAY
FROM employees e;
Run Code Online (Sandbox Code Playgroud)

演示:http://rextester.com/WHI96898