MySQL选择从7天前开始的行

28

我完全被这个问题难住了,已经尝试了几个小时但没有成功,希望有人可以帮忙。尝试构建一个 cron 脚本,每天运行一次,返回距离当前日期正好七天的行。

问题是,我的查询没有返回任何东西。没有错误消息,什么都没有(我知道最近7天数据库中有条目 - 我们每天大约会有7000条新条目,所以它们在那里!)我尝试用SELECT *并输出编辑日期进行测试,成功了,所以一切都正常,除了我的SQL脚本。

我引用的列(edit_date)的类型为“datetime”,格式为Y-m-d h-m-s。该列在创建和编辑时始终分配了datetime值。

function get_ad_sql($table){
    $sql = "SELECT 
                * 
            FROM 
                ".$table." 
            WHERE 
                edit_date = DATE_SUB(NOW(), INTERVAL 7 DAY)
            ";  
    return $sql;
}

然后调用函数并“尝试”回显主键:

$sqlAng = get_ad_sql('angebote');
$result = mysql_query($sqlAng);
while($row = mysql_fetch_array($result)){
    echo $row['primary_key'];
}

我已经尝试了这里和在线上找到的所有DATE_SUB(NOW(),INTERVAL 7 DAY)的变化形式,包括CURDATE(),DATE_FORMAT(edit_date,'%m/%d/%Y'),但无法让任何东西正常工作。希望有人能帮助我!


SELECT DATE_FORMAT(edit_date),DATE_SUB(DATE_FORMAT(NOW()), INTERVAL 7 DAY) 这条语句会返回什么?它们看起来一样吗? - marnir
感谢大家在发布几分钟内的帮助,非常感激。我尝试了点赞,但似乎在获得15个声望点之前无法进行。再次感谢大家! - Tim Blackburn
4个回答

51

很少出现相同的日期时间条目,这些条目提供了秒级的日期和时间。因此,为了获得适当的结果,我们需要忽略时间部分,处理日期部分,因此使用 CURDATE() 函数。

您可以忽略时间部分,并使用以下内容将其与日期进行比较:

function get_ad_sql($table){
    $sql = "SELECT 
                * 
            FROM 
                ".$table." 
            WHERE 
                DATE(edit_date) = DATE_SUB(CURDATE(), INTERVAL 7 DAY)
            ";  
    return $sql;
}

请注意:我已经更新了查询,比较运算符的右侧以提高性能。 - Ghazanfar Mir
已经注意并实现了,没有任何问题(但我在末尾添加了DAY...是INTERVAL的默认设置吗?)。 - Tim Blackburn
添加日期是很好的,您可以查看以下函数以获取更多详细信息:http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add - Ghazanfar Mir
1
除非我将 "INTERVAL 7" 更改为 "INTERVAL 7 DAY",否则它对我无法运行。 - Josh Ribakoff
1
建议改进:左侧的DATE(edit_date)表示每个已检查的行都必须进行类型转换(您可以在执行EXPLAIN EXTENDED ...之后,在此之后显示警告)。更好的替代方案是WHERE edit_date> = DATE_SUB(CURDATE(),INTERVAL 7 DAY)AND edit_date <DATE_SUB(CURDATE(),INTERVAL 6 DAY); - Marcel

10

NOW()返回DATETIME值,如果你需要只获取日期而不包括时间,可以使用DATE函数,例如 -

SELECT * FROM table WHERE edit_date = DATE_SUB(DATE(NOW()), INTERVAL 7 DAY);

如果edit_date字段的类型是DATETIME,则此字段也应该被DATE()函数包装 -
SELECT * FROM table WHERE DATE(edit_date) = DATE_SUB(DATE(NOW()), INTERVAL 7 DAY);

6
您的脚本已经可用... 我很怀疑您有没有找到恰好7天前的内容(精确到秒)。
也许你想要这样的东西:WHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)
或者,如果您只想比较日期(而不是时间)部分,请比较DATE()的输出。

是的,我试图比较日期,不需要到秒。非常感谢你们的帮助! - Tim Blackburn

5
 SELECT SUBDATE(CURDATE(), 7)

试一下。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接