4

语言:PHPMySQL

我正在尝试做的事情:
在一周内庆祝生日的电子邮件用户,比他们的生日提前一周

事实:

  • 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

期望的结果:

在一周内庆祝生日的电子邮件用户,比他们的生日提前一周

4

4 回答 4

4

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

但是,如果您要查找生日在今天到 7 天之后的某个时间的人,您可以使用以下DATEDIFF功能:

WHERE DATEDIFF(NOW(),`birthday`)%365 BETWEEN 0 AND 7
于 2013-06-27T08:15:53.903 回答
2

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

给定出生日期@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
于 2013-06-27T09:33:45.233 回答
0

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

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

您得到的原因false是因为处理查询时出错。在这种情况下,您可以使用该mysql_error()函数来了解您尝试的最后一个 MySQL 查询出了什么问题。

还有一些更简单的方法来编写这个查询,例如使用DATEDIFF()

于 2013-06-27T08:15:42.937 回答
0
SELECT * FROM table_birthdays WHERE DATEDIFF(NOW(),`birthday`)%365 >= 0 AND DATEDIFF(NOW(),`birthday`)%365 <= 7

如果日期 > 零(今天)且小于 7(距离 now() 的 1 周),则只需对它进行日期差异,那么他们的生日在下周内,因此您可以通过电子邮件发送给他们或其他什么。别忘了你还需要设置一个标志来表示他们已经收到通知或其他任何事情,这样你就不会每天都这样做了

作为注意点使用 >= <= 而不是在 as 之间BETWEEN 0 and 7将忽略第 0 天(今天)和第 7 天(从现在开始),因此有效地BETWEEN 0 and 7与使用相同>=1 and <=6

于 2013-06-27T08:16:26.657 回答