MySQL查询:从数据库中检索“生日”(YYYY-MM-DD),&选择那些在当周(无论年份)下跌的人。 / PHP

时间:2013-06-27 08:10:18

标签: php mysql date

语言: PHP MySQL

我正在尝试做什么:
通过电子邮件向在一周内庆祝生日的用户提供提前一周的生日。

事实:

  • birthday日期以标准 YYYY-MM-DD 日期格式存储

技术上:

  • 从数据库中检索'birthday'(YYYY-MM-DD),然后选择'birthday'当前周内的用户(无论年份如何)。
  • 输出结果。

我在做什么:

假设我们已经有了数据库连接...

//execute the SQL query and return records
$result = mysql_query("SELECT * FROM table_birthdays WHERE strftime('%W', column_birthday) == strftime('%W', 'now')");

// debug
var_dump($result);

//fetch the data from the database 
while ($row = mysql_fetch_array($result)) {

      // DO SOMETHING WITH RESULTS
   echo $row['column_birthday']."<br><br>" .
   "Email: " . $row['column_email'];

}
//close the connection
mysql_close($dbhandle);

基于以上代码......
我目前收到以下结果:

  • var_dump()返回:

      

    布尔(假)

  • while循环返回:

      

    警告:mysql_fetch_array()期望参数1是资源,   布尔值在...中给出。


问题:
我做得对吗?如果找到结果,while循环会返回boolean吗? 或者......我应该以不同的方式查询,以达到我想要的结果吗? (引自下文)

期望的结果:

  

通过电子邮件向在一周内庆祝生日的用户发送电子邮件 a   提前一周从他们的生日开始。

4 个答案:

答案 0 :(得分:4)

MySQL有一个名为WEEKOFYEAR的便捷功能 - 如果您选择全部WHERE WEEKOFYEAR(`birthday`) = WEEKOFYEAR(NOW()),那么您将获得本周过生日的所有用户。

但是,如果您正在寻找生日在今天至今7天之间某个时间的人,您可以使用DATEDIFF功能:

WHERE DATEDIFF(NOW(),`birthday`)%365 BETWEEN 0 AND 7

答案 1 :(得分:1)

这是我的解决方案。这有点复杂,但我们还需要考虑闰年。

鉴于出生日期@dob,并给出当前日期@curdate,我们可以用此计算neth生日:

SELECT
  @dob +
    INTERVAL
      YEAR(@curdate)-YEAR(@dob) +
      (MONTH(@dob)<MONTH(@curdate)
       OR (MONTH(@dob)=MONTH(@curdate) AND DAY(@dob)<DAY(@curdate)))
    YEAR nextbd

因此,如果例如当前日期为“2013-06-27”且出生日期为“1980-06-28”,则下一个生日将在“2013-06-28”,而如果日期为出生时间是'1980-06-26'下一个生日将在'2014-06-26'。

如果当前日期为“2013-02-28”且出生日期为“2012-02-29”,则下一个生日将在“2013-02-28”。

可以使用DATEDIFF计算下一个生日的天数:

SELECT
  DATEDIFF(
    @dob +
      INTERVAL
        YEAR(@curdate)-YEAR(@dob) +
        (MONTH(@dob)<MONTH(@curdate)
         OR (MONTH(@dob)=MONTH(@curdate) AND DAY(@dob)<DAY(@curdate)))
      YEAR
    , @curdate) days_to_next_bd

并且您可以添加此数字所在的where条件,例如BETWEEN 0 AND 7

您的最终查询可能会变为:

SELECT *
FROM   table_birthdays
WHERE
  DATEDIFF(
    column_birthday +
      INTERVAL
        YEAR(CURDATE())-YEAR(column_birthday) +
        (MONTH(column_birthday)<MONTH(CURDATE())
         OR (MONTH(column_birthday)=MONTH(CURDATE())
             AND DAY(column_birthday)<DAY(CURDATE())))
      YEAR
    , CURDATE()) BETWEEN 0 AND 7

答案 2 :(得分:0)

您的查询中有错误,SQL中没有==运算符 - 请改用=。此外,NOW的使用方式不同。

SELECT * FROM table_birthdays WHERE strftime('%W', column_birthday) = strftime('%W', NOW())"

您获得false的原因是因为处理查询时出错。在这种情况下,您可以使用mysql_error()函数来描述您尝试的上一次MySQL查询出了什么问题。

例如,使用DATEDIFF()编写此查询的方法也比较简单。

答案 3 :(得分:0)

SELECT * FROM table_birthdays WHERE DATEDIFF(NOW(),`birthday`)%365 >= 0 AND DATEDIFF(NOW(),`birthday`)%365 <= 7

如果日期为&gt;则为日期差异零(今天)和少于7(从现在起1周),然后他们的生日在下周,所以你可以给他们发电子邮件或其他什么。不要忘记你还需要设置一个标志,说明他们已被通知或其他什么,以免你每天都不再这样做

作为使用中的注释&gt; =&lt; =而不是BETWEEN 0 and 7之间将忽略第0天(今天)和第7天(从现在起一周),因此有效BETWEEN 0 and 7与使用相同>=1 and <=6