mySQL SELECT即将到来的生日

Dan*_*nny 13 mysql sql database

我正在尝试编写一个查询来选择生日在接下来7天内的数据库用户.

我做了很多研究,但我无法提出一个有效的解决方案.

生日字段存储为varchar,例如'04/16/93'有什么方法可以使用它吗?

这是我到目前为止:

SELECT * 
FROM   `PERSONS` 
WHERE  `BIRTHDAY` > DATEADD(DAY, -7, GETDATE()) 
Run Code Online (Sandbox Code Playgroud)

我应该说得更清楚,我想找到生日,而不是出生日期.所以我只是寻找几天而不是几年.

Pra*_*obo 42

要在接下来的7天内获得所有生日,请将出生日期与今天的年份差异添加到出生日期,然后查看是否在接下来的七天内.

SELECT * 
FROM  persons 
WHERE  DATE_ADD(birthday, 
                INTERVAL YEAR(CURDATE())-YEAR(birthday)
                         + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                YEAR)  
            BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);
Run Code Online (Sandbox Code Playgroud)

如果你想排除今天的生日,只需>改为>=

SELECT * 
FROM  persons 
WHERE  DATE_ADD(birthday, 
                INTERVAL YEAR(CURDATE())-YEAR(birthday)
                         + IF(DAYOFYEAR(CURDATE()) >= DAYOFYEAR(birthday),1,0)
                YEAR)  
            BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY);

-- Same as above query with another way to exclude today's birthdays 
SELECT * 
FROM  persons 
WHERE  DATE_ADD(birthday, 
                INTERVAL YEAR(CURDATE())-YEAR(birthday)
                         + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                YEAR) 
            BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
     AND DATE_ADD(birthday, INTERVAL YEAR(CURDATE())-YEAR(birthday) YEAR) <> CURDATE();


-- Same as above query with another way to exclude today's birthdays 
SELECT * 
FROM  persons 
WHERE  DATE_ADD(birthday, 
                INTERVAL YEAR(CURDATE())-YEAR(birthday)
                         + IF(DAYOFYEAR(CURDATE()) > DAYOFYEAR(birthday),1,0)
                YEAR) 
            BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
     AND (MONTH(birthday) <> MONTH(CURDATE()) OR DAY(birthday) <> DAY(CURDATE()));
Run Code Online (Sandbox Code Playgroud)

这是所有查询的演示

  • 第一个查询只返回新生儿,第二个只返回将来出生的人.... (2认同)
  • 如果您在 12 月 31 日运行此脚本,而生日是 1 月 1 日,则此脚本将不起作用。 (2认同)
  • 我担心这个解决方案也存在闰年问题(参见我对Todor答案的例子).常见的问题是,3月至12月的"DAYOFYEAR"生日在跳跃和非跳跃年份之间有所不同 (2认同)

小智 11

它非常简单.不需要使用任何if条件或其他任何你只需要使用mysql的DATE_FORMAT()函数.

这是我的SQL查询

SELECT id,email ,dob FROM `users` where DATE_FORMAT(dob, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d') and DATE_FORMAT(dob, '%m-%d') <= DATE_FORMAT((NOW() + INTERVAL +7 DAY), '%m-%d')
Run Code Online (Sandbox Code Playgroud)

  • 当您尝试在明年获得未来的生日时,这实际上不起作用。 (4认同)
  • 如果间隔到明年将不起作用。 (2认同)

Tod*_*dor 6

这是我的解决方案.如果出生日期是1月1日,今天的日期是12月31日,它也有效.

SELECT `id`, `name`, `dateofbirth`,
    DATE_ADD(
        dateofbirth, 
        INTERVAL IF(DAYOFYEAR(dateofbirth) >= DAYOFYEAR(CURDATE()),
            YEAR(CURDATE())-YEAR(dateofbirth),
            YEAR(CURDATE())-YEAR(dateofbirth)+1
        ) YEAR
    ) AS `next_birthday`
FROM `user` 
WHERE 
    `dateofbirth` IS NOT NULL
HAVING 
    `next_birthday` BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 7 DAY)
ORDER BY `next_birthday`
LIMIT 1000;
Run Code Online (Sandbox Code Playgroud)

  • 如果出生年份是闰年而当前不是,我担心这会出错,反之亦然: dateofbirth = 2000-07-04, curdate = 2015-07-05 将 next_birthday 计算为 2015-07-04 而不是2016-07-04(不影响下周查询);但是 dateofbirth = 2001-07-04, curdate = 2016-07-04 导致 next_birthday = 2016-07-04 而不是 2015-07-04 (2认同)

小智 5

我做了很多“研究”,这是我的解决方案,我想它很容易理解!

SELECT *,
(366 + DAYOFYEAR(birth_date) - DAYOFYEAR(NOW())) % 366 as left_days
FROM `profile`
ORDER BY left_days;
Run Code Online (Sandbox Code Playgroud)


小智 5

当出生日期发生在闰年期间时,任何使用 DAYOFYEAR() 的解决方案都会有缺陷。在处理年龄或生日时,请考虑使用 TIMESTAMPDIFF()。

\n

当前年龄可以计算为

\n
timestampdiff(YEAR, person.date_of_birth, curdate())\n
Run Code Online (Sandbox Code Playgroud)\n

通过将年龄添加到出生日期来计算即将到来的生日。

\n
DATE_ADD(\n    person.date_of_birth, \n    INTERVAL timestampdiff(YEAR, person.date_of_birth, curdate())+1 YEAR\n)\n
Run Code Online (Sandbox Code Playgroud)\n

将其放在一起来解决 OP\xe2\x80\x99s 查询

\n
select\n    DATE_ADD(\n        person.date_of_birth, \n        INTERVAL timestampdiff(YEAR, date_add(person.date_of_birth,INTERVAL 1 DAY), curdate())+1 YEAR\n    ) upcoming_birthday\nfrom person\nhaving upcoming_birthday between curdate() and DATE_ADD(curdate(), INTERVAL 7 DAY)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,我在计算年龄时在 date_of_birth 上添加了一天,否则不会返回今天\xe2\x80\x99s 的生日。

\n