【问题标题】:MySQL select rows from exactly 7 days agoMySQL 从 7 天前选择行
【发布时间】: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 个代表点之前,我似乎无法投票。再次感谢大家!

标签: php mysql intervals


【解决方案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() 的输出。

      【讨论】:

      • 是的,我试图比较日期,而不是第二个。非常感谢你们的帮助!
      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多