语言:PHP和MySQL
我要做的事情:
向在一周内庆祝生日的用户发送电子邮件,距离他们生日还有一周。
事实:
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
相同