我正在尝试做什么:
通过电子邮件向在一周内庆祝生日的用户提供提前一周的生日。
的事实: 的
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 提前一周从他们的生日开始。
答案 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