MySQL查询:检索';生日';(YYYY-MM-DD),&;选择那些在本周(不考虑年份)下跌的股票.


MySQL Query: Retrieve 'birthdays' (YYYY-MM-DD) from the database, & select those that fall w/in the current week (regardless of year). / PHP

语言:PHPMySQL

我要做的事情:
向在一周内庆祝生日的用户发送电子邮件,距离他们生日还有一周

事实:

  • birthday日期以标准的日期格式存储

技术:

  • 从数据库中检索'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()返回:

    bool(false)

  • while循环返回:

    警告:mysql_fetch_array()要求参数1为resource,布尔值在…中给定


问题:
我做得对吗?如果找到结果,while循环是否会返回boolean
或为了实现我想要的结果,我是否应该以不同的方式对此进行查询?(引用如下)

期望结果:

向在一周内庆祝生日的用户发送电子邮件,a离他们生日还有一周

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

然而,如果你正在寻找生日在今天到7天后的人,你可以使用DATEDIFF功能:

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

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

给定出生日期@dob,给定当前日期@curdate,我们可以用以下公式计算下一个生日:

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

查询中出现错误,SQL中没有==运算符,请改用=。此外,NOW的使用也有所不同。

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

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

还有一些更简单的方法可以编写此查询,例如使用DATEDIFF()。

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

如果日期大于零(今天)且小于7(从现在起一周),那么他们的生日就在下周,所以你可以给他们发电子邮件或其他什么。别忘了,你还需要设置一个标志,说明他们已经收到通知或其他什么,这样你就不会每天都这样做

作为一个要点,请使用>=<=而不是介于两者之间,因为BETWEEN 0 and 7将忽略第0天(今天)和第7天(从现在起一周),因此有效地BETWEEN 0 and 7与使用>=1 and <=6 相同