【问题标题】:What Is The Optimal Way To Select Rows From Last 7 Days?从过去 7 天中选择行的最佳方法是什么?
【发布时间】:2009-09-29 21:06:13
【问题描述】:

从表中仅选择过去 7 天内创建的行的最佳方法是什么?

MySQL 中有几十个时间和日期函数,我有点不知道什么是最简单的方法。

为了这个问题,假设您有一个名为“my_table”的表,它包含一行“created_at”,它是一个 DATETIME。

SELECT * FROM my_table WHERE ...

你会在 WHERE 子句中填写什么?

【问题讨论】:

  • 嗯,有几种方法可以做到这一点。但是,如果您使用一种语言来构建查询,那将会改变一些事情。
  • @brandon,不是真的,您应该使用数据库来执行此操作,而不是应用层。
  • 做同一件事的方法太多了。所以社区 rox!
  • @Byron:是的,MySQL 也是如此,尽管正如 Richard 所说, 日期/时间函数的数组令人眼花缭乱。 :-)
  • @Brandon Hansen:我实际上是在使用 Zend Framework 及其组件(Zend_Db_Table、Zend_Db)来创建 sql 查询,但这并没有改变任何事情。你可以很好地只取一个 where 对象并将一个像 'AND field = 5' 这样的字符串连接到它。

标签: sql mysql datetime


【解决方案1】:
WHERE DATEDIFF(NOW(), created_at) <= 7;

我喜欢它,因为它写着:“现在和创建时间之间的日期差异最多为 7(天)。”在我自己的脑海里

【讨论】:

  • 嘿,我喜欢这个 :) 它非常简单干净 :)
  • @Drew .. 我在这里可能错了.. 但该查询不会先转换所有 created_at 记录然后再匹配吗?这不是开销,然后以相反的方式进行匹配吗?
  • @Sab:我怀疑你是对的,尤其是如果created_at 有一个索引(它确实有,对吧 Richard?)。这肯定会让优化器的生活变得更难,但需要进行基准测试,看看它是否能克服它。
  • 我还没有查看函数,但要小心简单地说“从现在起超过 7 天”,因为如果它是下午 1 点,许多这些类型的函数只返回结果来自最后一个7 * 24 hours,因此忽略了第一天下午 1 点之前的任何记录。这就是为什么我的答案在任何时间戳引用周围使用DATE()
  • created_at 实际上没有索引,因为它用得不多,我只在一个页面上的 where 子句中使用它。
【解决方案2】:
...WHERE created_at >= Date_Add(now(), INTERVAL -7 DAY)

这是我的首选方式,因为它是如此...清晰。但是ADDDATE 也很好(为了清楚起见,您也可以使用INTERVAL 表单;它的默认值为天,因此您会看到人们将其关闭)。您想要对created_at 进行计算并将其与now() 进行比较,因为这需要对每一行的created_at 进行计算(假设MySQL 没有对其进行优化),而修改 now() 并与未修改的 created_at 进行比较意味着 MySQL 会执行该位一次并在与行比较时使用结果,更不用说索引了。

【讨论】:

  • 哇,真不敢相信没有人注意到Date_Add 中缺少的下划线。我已经... 添加了 ...它。 ;-)
【解决方案3】:

...... WHERE created_at >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)

希望这会有所帮助

【讨论】:

    【解决方案4】:
     WHERE  ADDDATE(datefield, 7) > NOW();
    

    【讨论】:

      【解决方案5】:
      SELECT * FROM my_table
      WHERE DATE(created_at) >= SUBDATE(DATE(NOW()), 7)
      

      【讨论】:

        【解决方案6】:

        SELECT * FROM my_table WHERE my_table.datefield > sysdate - 7

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-07
          • 1970-01-01
          • 2019-10-26
          • 2017-02-04
          • 1970-01-01
          • 2010-09-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多