【问题标题】:MySQL get next instance of a date of birth / birthdayMySQL获取出生日期/生日的下一个实例
【发布时间】:2019-12-20 10:34:36
【问题描述】:

我正在尝试根据 DOB 在 MySQL 中查找日期的下一个实例 - 例如,如果 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 找到了 How to calculate next birthday given a date of birth?,我认为它可以工作,但它使用了一个名为 age 的函数,它似乎在 MySQL 中不起作用

【问题讨论】:

  • 什么是 DOB 类型?
  • 这可以帮助您替换年龄函数:stackoverflow.com/a/19522129/4461980 然后它与您链接到的问题中的查询基本相同
  • 如果DOB是2000-02-29应该是什么结果?
  • 还要注意,在mysql中这样做不一定更快,你有基准测试吗?不要忘记,提高速度的几微秒可能不会超过您在后端执行此操作所获得的易于维护性所带来的好处
  • 我怀疑它会更快。

标签: mysql sql date


【解决方案1】:

您可以按如下方式进行日期运算:

dob
+ interval (
    year(curdate()) 
    - year(dob) 
    + (dayofyear(curdate()) > dayofyear(dob))
) year

基本上,这会获取当前日期和出生年份之间的差异,如果当前年份的生日是过去,则加 1。这为您提供了为下一个生日添加到出生日期的年数。

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

【讨论】:

    【解决方案2】:

    使用示例数据和查询创建了一个小提琴以获取下一个生日日期。下面分享的是query和sql fiddle链接:

    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 小提琴:http://sqlfiddle.com/#!9/033ad4/18

    【讨论】:

    • 这确实对我有用 - 有一件事是日期返回为 2020-1-1 例如。他们能在 2020 年 1 月 1 日回来吗?
    • 你可以做到这一点,但同样在未来将很难管理。我会建议在 php 中执行,它将是单行。
    【解决方案3】:

    也许是这样。本年度。

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

    在沙盒中 https://paiza.io/projects/iCDmx0RP1jck56xXzGu2Jw?language=mysql

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2021-10-25
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多