【问题标题】:Compare current date with birthday in PHP/MySQL [duplicate]在PHP / MySQL中将当前日期与生日进行比较[重复]
【发布时间】:2015-03-01 22:37:09
【问题描述】:

我有以下代码,除了一个主要缺陷外,它运行良好...仅当生日/周年纪念日与当前年份相同时才有效。

<?php
    $query = mysql_query( "SELECT mFN, mSN, TIMESTAMPDIFF(YEAR, mBirthday, CURDATE()) 
    AS mAge, mBirthday FROM memberData WHERE mBirthday BETWEEN CURDATE() + INTERVAL 1 DAY AND CURDATE() + INTERVAL 1 WEEK" );
    while ($rows = mysql_fetch_array($query, MYSQL_ASSOC)) {
        echo sprintf("%s %s will be %s on the %s. <br>", $rows['mFN'], $rows['mSN'], $rows['mAge'], $rows['mBirthday']);
}

因此,它的作用是将当前日期 + 一周的间隔与存储的生日进行比较...

如果某人的生日是 2015 年 3 月 5 日,它会找到他们! 虽然如果某人的生日是 1995 年 3 月 5 日,那么由于这一年没有运气......关于我将如何解决这个问题的任何想法?对编程很陌生,不知道如何解决这个问题。

<?php
    $query = mysql_query( "SELECT mFN, mSN, TIMESTAMPDIFF(YEAR, 
   STR_TO_DATE( concat(year(curdate()), '-', month(mBirthday), '-', day(mBirthday) ), '%Y-%m-%d' ) , CURDATE()) 
AS mAge, mBirthday FROM memberData 
WHERE 
   STR_TO_DATE( concat(year(curdate()), '-', month(mBirthday), '-', day(mBirthday) ), '%Y-%m-%d' )  
      BETWEEN CURDATE() + INTERVAL 1 DAY AND CURDATE() + INTERVAL 1 WEEK

    while ($rows = mysql_fetch_array($query, MYSQL_ASSOC)) {
        echo sprintf("%s %s will be %s on the %s. <br>", $rows['mFN'], $rows['mSN'], $rows['mAge'], $rows['mBirthday']);
}
?>

我开始解析错误:语法错误,意外的 T_STRING,sprintf 行。

【问题讨论】:

  • 应该有 MySQL 函数返回日期戳的日期和月份数,您可以比较它们 - 只需忽略年份。在任何一年的 3 月 5 日生日时,您会分别寻找 5 和 3。

标签: php mysql date


【解决方案1】:

您可以匹配 month()day() 函数。例如:

where month(CURDATE()) = month(yourdate) and day(curdate()) = day(yourdate)

不过,您需要小心闰年(2 月 29 日)。

要针对当前年份的日期进行测试,您可以使用以下内容:

-- replace year in test date with current year
STR_TO_DATE( concat(year(curdate()), '-', month(mBirthday), '-', day(mBirthday) ), '%Y-%m-%d' ) 

虽然将月份和日期作为单独的字段存储在数据库中可能更有效。

最终查询类似于:

SELECT mFN, mSN, 
    TIMESTAMPDIFF(YEAR, mBirthday, CURDATE()) AS mAge, 
    mBirthday FROM memberData 
WHERE 
   STR_TO_DATE( concat(year(curdate()), '-', month(mBirthday), '-', day(mBirthday) ), '%Y-%m-%d' )  
      BETWEEN CURDATE() + INTERVAL 1 DAY AND CURDATE() + INTERVAL 1 WEEK 

以下是替代方法:

finding if an anniversary is coming up in n days in MySql

【讨论】:

  • 我将如何在我现有的查询中实现这一点?
  • 啊,你想要下周的生日。一种方法...您可以从测试日期中删除月份和日期,并将年份替换为当前年份。然后使用 STR_TO_DATE(); 转换回日期;因此,您可以使用当年的周年纪念日来测试 curdate。将日期保存为日、月、年可能会有所帮助。
  • WHERE MONTH(CURDATE()) + INTERVAL 1 WEEK = MONTH(mBirthday) AND DAY(CURDATE()) + INTERVAL 1 WEEK = DAY(mBirthday)"); -- 类似这些?但这不起作用..有什么想法吗?
  • 我认为相同的查询,但测试当前年份的日期.. 类似:STR_TO_DATE( concat(year(curdate()), '-', month(mBirthday), '- ', day(mBirthday) ), '%Y-%m-%d')
  • 对不起,我是新来的……这怎么会提前一周搜索?实际的最终查询会是什么样子
猜你喜欢
  • 2017-05-15
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多