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)
这是所有查询的演示
小智 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)
这是我的解决方案.如果出生日期是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)
小智 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当前年龄可以计算为
\ntimestampdiff(YEAR, person.date_of_birth, curdate())\n
Run Code Online (Sandbox Code Playgroud)\n通过将年龄添加到出生日期来计算即将到来的生日。
\nDATE_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 查询
\nselect\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