4

我有包含用户生日和姓名的数据库。我想选择从 7 天前到未来 7 天生日/命名日的所有用户,此选择有效,但我不知道如何解决生日/命名日为 31.12 的用户的问题。例如。PHP 将返回“用户在 3 天前过生日”,此选择仅在年底前 7 天和新年后 7 天有效。非常感谢您的帮助。

SELECT `name`, `surname`, `gender`, ('birthday') AS event,
  DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW())))) AS diff
FROM `users`
WHERE DATEDIFF(NOW(), DATE(REPLACE(`birthday`, YEAR(`birthday`), YEAR(NOW()))))
BETWEEN -7 AND 7
UNION
  SELECT `name`, `surname`, `gender`, ('namesday') AS event,
    DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW())))) AS diff
  FROM `users`
  WHERE DATEDIFF(NOW(), DATE(REPLACE(`namesday`, YEAR(`namesday`), YEAR(NOW()))))
  BETWEEN -7 AND 7
4

3 回答 3

1

我认为这很简单,使用 to_days()。这种方式依赖于数据库中设置的日历,因此您不必担心闰年。

select
    `name`, `surname`, `gender`, ('birthday') AS event,
    to_days(concat(year(current_date()),'-',month(`birthday`), '-',day_of_month(`birthday`))) as current_yr_bday 
FROM `users`
WHERE 
    to_days(concat(year(current_date()),'-',month(`birthday`), '-',day_of_month(`birthday`))) between to_days(date_sub(current_date() interval 7 days) and to_days(date_add(current_date() interval 7 days
于 2012-05-14T23:20:18.493 回答
1

好问题。这是我到目前为止所做的。我不确定它是否完美,但这可能是一个好的开始。试试看。

select *,
if(right(birthday,5)>=right(curdate(),5),concat(year(curdate()),'-',right(birthday,5)),concat(year(curdate()+interval 1 year),'-',right(birthday,5))) as next_birthday,
if(right(birthday,5)<right(curdate(),5),concat(year(curdate()),'-',right(birthday,5)),concat(year(curdate()-interval 1 year),'-',right(birthday,5))) as prev_birthday
from users
having next_birthday 
between curdate() - interval 7 day and curdate() + interval 7 day
or prev_birthday 
between curdate() - interval 7 day and curdate()
于 2012-05-14T22:40:27.283 回答
0

蛮力方法是计算 YEAR-1、YEAR、YEAR+1 的差异,然后检查这三个总和中的任何一个是否满足您的条件。

算出现在和一月一日之间的差异并据此计算年份,就不是那么蛮力了。

有趣的问题,如果我想到别的东西,我会回来的。

于 2012-05-14T22:41:02.197 回答