MySQL获取出生日期/生日的下一个实例

MySQL获取出生日期/生日的下一个实例,mysql,sql,date,Mysql,Sql,Date,我试图在MySQL中找到下一个基于DOB的日期实例-例如,如果DOB是1975-12-20,我们今天运行它,那么下一个生日是2020-12-20 同样,如果DOB为1975-12-19,则下一个生日为2020-12-19,但如果DOB为1975-12-21,则下一个生日为2019-12-21 我可以在PHP中通过分解日期和替换年份来实现这一点,但我想尝试在MySQL中实现,因为它会更快地运行,等等 DOB是日期字段0000-00-00 我找到了postgressql,我认为它可以工作,但它使用了

我试图在MySQL中找到下一个基于DOB的日期实例-例如,如果DOB是1975-12-20,我们今天运行它,那么下一个生日是2020-12-20

同样,如果DOB为1975-12-19,则下一个生日为2020-12-19,但如果DOB为1975-12-21,则下一个生日为2019-12-21

我可以在PHP中通过分解日期和替换年份来实现这一点,但我想尝试在MySQL中实现,因为它会更快地运行,等等

DOB是日期字段0000-00-00


我找到了postgressql,我认为它可以工作,但它使用了一个名为age的函数,在MySQL中似乎不起作用

dob
+ interval (
    year(curdate()) 
    - year(dob) 
    + (dayofyear(curdate()) > dayofyear(dob))
) year
基本上,这取当前日期和出生年份之间的差值,如果当前年份的生日在过去,则加1。这将为您提供为获得下一个生日而向dob添加的年数


在2月29日,上述表达式将返回非闰年的2月28日。

创建了一个样本数据和查询,以获取下一个生日。下面的共享是查询和sql FIDLE链接:

select *, 
IF(month(dob) = month(now()) AND day(dob) > day(now()), concat(Year(now()),'-',month(dob),'-',day(dob)) ,concat(Year(now())+1,'-',month(dob),'-',day(dob))) as nextBirthDay
from TableName

Sql fiddle:

可能是这样。就本年度而言

select DATE_ADD(dob, INTERVAL TIMESTAMPDIFF(year, dob, now()) + (dayofyear(dob) > dayofyear(now())) YEAR) as result
在沙箱中

什么是DOB类型?这可以帮助您替换年龄函数:然后它基本上与您链接到的问题中的查询相同,如果DOB是
2000-02-29
,结果应该是什么?还要注意,在mysql中这样做不一定更快,您对其进行了基准测试吗?别忘了,几微秒的速度提升可能不会超过在后端进行维护的便利性带来的好处。我怀疑这会更快。这对我来说确实有效——比如,日期会回到2020-1-1。他们能回到2020-01-01吗?你可以这么做,但在未来这将很难管理。我建议用php来做,它将是单行程序。