MySQL 从 7 天前选择行

Posted

技术标签:

【中文标题】MySQL 从 7 天前选择行【英文标题】:MySQL select rows from exactly 7 days ago 【发布时间】:2011-12-07 02:06:59 【问题描述】:

我完全被这个难住了,尝试了几个小时但没有成功,希望有人能提供帮助。尝试构建一个每天运行的 cron 脚本,它返回比当前日期正好早 7 天的行。

问题是,我的查询没有返回任何内容。没有错误消息,什么都没有(我知道过去 7 天数据库中有条目 - 我们每天大约有 7000 个新条目,所以它们就在那里!)我尝试了 SELECT * 并成功回显编辑日期,所以一切正常,除了我的 SQL 脚本。

我引用的列 (edit_date) 是“日期时间”类型,格式为 Y-m-d h-m-s。此列始终具有在创建和编辑时分配的日期时间值。

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) 给你什么?它们看起来一样吗? 感谢大家在几分钟内的帮助,非常感谢。我已经尝试过投票,但在我获得 15 个代表点之前,我似乎无法投票。再次感谢大家! 【参考方案1】:

很少有相同的日期时间条目将日期和时间设置为秒。因此,为了得到合适的结果,我们需要忽略时间部分,处理日期部分,因此,使用CURDATE()函数。

您可以忽略时间部分并使用以下方法与日期进行比较:

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

【讨论】:

请注意:我更新了比较运算符右侧的查询以提高性能。 注意到并没有问题地实施(但我在末尾添加了 DAY...这是 INTERVAL 的默认值吗? 加Day就好了,你可以看看这些函数了解更多详情:dev.mysql.com/doc/refman/5.5/en/… 除非我将“INTERVAL 7”更改为“INTERVAL 7 DAY”,否则不会为我运行 建议改进:左侧的 DATE(edit_date) 意味着必须对每个选中的行进行类型转换(您可以在执行 EXPLAIN EXTENDED ... 之后看到这一点,然后在 SHOW WARNINGS 之后)。更好的选择是 WHERE edit_date >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND edit_date 【参考方案2】:

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);

【讨论】:

【参考方案3】:
 SELECT SUBDATE(CURDATE(), 7)

试试这个。

【讨论】:

【参考方案4】:

您的脚本正在运行...我非常怀疑您在 7 天前(到第二天)确切有什么东西。

也许你想要什么WHERE edit_date>DATE_SUB(NOW, INTERVAL 7 DAY) AND edit_date<DATE_SUB(NOW, INTERVAL 6 DAY)

或者,如果您只想比较日期(而不是时间)部分,请改为比较 DATE() 的输出。

【讨论】:

是的,我试图比较日期,而不是第二个。非常感谢你们的帮助!

以上是关于MySQL 从 7 天前选择行的主要内容,如果未能解决你的问题,请参考以下文章

查看mysql删除表1天前数据

如何根据 3 个不同的列在 mysql 中选择行

从 MySQL 中选择最后 N 行

从 MySQL 中选择最后 N 行

从mysql表中选择特定行

将mysql中的列从上到下行求和并选择值所在的行