【问题标题】:How should I filter dates in MySQL?我应该如何过滤 MySQL 中的日期?
【发布时间】:2009-06-16 17:15:55
【问题描述】:

我正在创建一组按年份和月份指定的“存档”页面。在我的表中,我有一个名为posteddatetime 字段。我想选择特定月份中的所有行。

我想到了两种解决方案:

(1) 使用字符串匹配:

SELECT ... WHERE posted LIKE '2009-06%'

(2)使用一些MySQL提取函数:

SELECT ... WHERE YEAR(posted)=2009 AND MONTH(posted)=6

其中哪些会更快,还有更好的解决方案吗?

【问题讨论】:

    标签: php mysql datetime


    【解决方案1】:
    SELECT   *
    WHERE    posted >= '2009-06-01'
             AND posted < '2009-07-01'
    

    与您的两个查询不同,此查询将有效地使用posted 上的索引。

    请注意,如果您将 posted 保留为 VARCHAR,则以下查询:

    SELECT ... WHERE posted LIKE '2009-06%'
    

    也会使用索引。

    【讨论】:

    • BETWEEN 运算符在这里不是更合适吗?
    • 嗯,我猜不是,因为您必须在 MySQL 中使用 BETWEEN 对日期进行 CAST:dev.mysql.com/doc/refman/5.0/en/…
    • @R.Bemrose:对于 6 月和 7 月的查询,它将准确返回 '2009-07-01 00:00:00' 的记录。这可能是个问题。
    • 谢谢,这很奏效。出于某种原因,我没有想到我可以使用 选择器...
    【解决方案2】:

    忽略对此设计的保留,标准语法将是“BETWEEN first-date AND last-date”,或者(如果您使用小于日期粒度),“posted >= first-date AND posted

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2020-08-18
      相关资源
      最近更新 更多