如何显示即将到来的生日?

4
我知道我不是第一个提出如何显示即将到来生日的人。但不幸的是,所有其他答案都没有帮助我找到如何做到这一点。
我有一个具有以下结构的数据库:
Id    -    Birthday
1          9/14/1996
2          8/27/1990
--         --

如您所见,在生日字段中存储了出生日期。我想显示未来五个生日(包括今天过生日的人)。

但是我该如何做呢?我尝试了这个方法,但它没有成功:

    $query="SELECT Id 
    FROM participants
    WHERE DATE_ADD(STR_TO_DATE(birthday, %n/%j/%Y), INTERVAL YEAR(CURDATE())-YEAR(STR_TO_DATE(birthday, %n/%j/%Y)) YEAR)";

感谢您的帮助!
2个回答

4

这个问题的关键是要排序,而不是使用where。这可以避免年底出现问题。

因此,逻辑是将所有生日在当前日期或之后的MM-DD的人放在前面,然后按日期顺序排列其余生日:

select p.*
from participants
order by (case when date_format(STR_TO_DATE(birthday, %n/%j/%Y), '%m-%d') >= date_format(now(), '%m-%d')
               then 0 else 1
          end),
         date_format(STR_TO_DATE(birthday, %n/%j/%Y), '%m-%d')
limit 5;

编辑:

如果你需要转换出生日期:

select p.*
from participants
order by (case when date_format(birthdate, '%m-%d') >= date_format(now(), '%m-%d')
               then 0 else 1
          end),
         date_format(birthdate, '%m-%d')
limit 5;

谢谢,不幸的是一切都按照ID(数据库内容的顺序),而不是按照生日排序。也许这是因为Birtday字段是一个tinytext字段?我应该先将其转换为日期吗? - Jordy
@Jordy . . . 这个问题显示生日是一个日期字段。所以,是的,你应该将它转换为日期。 - Gordon Linoff
如果您的字段是时间戳,仍然需要通过FROM_UNIXTIME(birthday)进行转换。 - mtness

1
select top 5 * 
from myTable 
where 
      month(dob) >= month(now()) 
  and day(dob) >= day(now()) 
order by dob asc

1
生日字段包含的是出生日期,而不是下一个生日的日期。 - Jordy
[FUNCTION myname.getdate does not exist] [函数myname.getdate不存在] - Jordy
你使用的是MySQL还是SQL Server? - AK47
对于 MySQL,使用 NOW() 而不是 getdate()。 - AK47
不可靠。例如:如果12月份只有两个生日,那么在12月份到来时,你只会看到2个即将到来的生日,因为1月确实比12月少。查询将在1月1日开始再次正常工作。 - Stanley Umeanozie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接