【问题标题】:MySQL SELECT WHERE datetime matches day (and not necessarily time)MySQL SELECT WHERE datetime 匹配天(不一定是时间)
【发布时间】:2012-12-15 18:32:38
【问题描述】:

我有一个包含日期时间列的表。无论时间如何,我都希望返回给定日期的所有记录。或者换句话说,如果我的表只包含以下 4 条记录,那么如果我限制为 2012-12-25,则只会返回第 2 条和第 3 条。

2012-12-24 00:00:00
2012-12-25 00:00:00
2012-12-25 06:00:00
2012-12-26 05:00:00

【问题讨论】:

标签: mysql date select


【解决方案1】:

永远不要使用像 DATE(datecolumns) = '2012-12-24' 这样的选择器 - 它是性能杀手:

  • 它将为所有行计算DATE(),包括那些不匹配的行
  • 这将使查询无法使用索引

使用起来更快

SELECT * FROM tablename 
WHERE columname BETWEEN '2012-12-25 00:00:00' AND '2012-12-25 23:59:59'

因为这将允许在不计算的情况下使用索引。

编辑

正如 Used_By_Already 所指出的,自 2012 年最初的回答以来,已经出现了 MySQL 的版本,其中使用 '23:59:59' 作为一天结束不再安全。更新版本应为

SELECT * FROM tablename 
WHERE columname >='2012-12-25 00:00:00'
AND columname <'2012-12-26 00:00:00'

答案的要点,即在计算表达式上避免选择器,当然仍然有效。

【讨论】:

  • 我正要评论 a1ex07 的解决方案似乎不如其他解决方案好。看完你的帖子,或许我需要换个思路了!
  • 刚刚在两台服务器上进行了测试,上面的速度比 date()='' 快得多(至少 10 倍),尤其是对于大型表。谢谢
  • @KonradViltersten 我使用了一种非常冗长的方式来表达查询,以使其更具可读性并明确我的观点,a.o.t。提炼它。 a1ex07 的答案具有稀疏语法。
  • @KonradViltersten - 更好的是:WHERE col &gt;= '2012-12-25' AND col &lt; '2012-12-25' + INTERVAL 1 DAY。它避免了0时间,适用于DATEDATETIMEDATETIME(6)等。并处理闰日等。
  • '2012-12-25 23:59:59' 作为一天结束时无效,这总是一个坏主意,它会导致支持子的 MySQL 版本出现错误第二次精度。最好使用 Rick James(上图)或 a1ex07(其他答案)的方法
【解决方案2】:

... WHERE date_column &gt;='2012-12-25' AND date_column &lt;'2012-12-26' 可能比DATE 工作得更好(如果您在 date_column 上有索引)。

【讨论】:

  • 我真的想知道什么是更快的 - 这个或BETWEEN 解决方案...有人标榜了吗?
  • 应该没什么区别。 BETWEEN 只是写field &gt;= value1 and fied&lt;= value2 的一种方式。
  • 请注意,根据 MySQL 手册:“为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,请使用 CAST() 将值显式转换为所需的数据类型。示例:如果您比较 DATETIME到两个 DATE 值,将 DATE 值转换为 DATETIME 值。如果在与 DATE 的比较中使用字符串常量(例如 '2001-1-1'),请将字符串转换为 DATE。因此,除非它们都是相同的类型,否则最好显式转换它们。
【解决方案3】:

你可以使用%

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'

【讨论】:

  • LIKE 似乎和 DATE(datetimecol) 一样慢。最好使用 Eugen 或 a1ex07 的解决方案。
  • 这并不总是与速度有关。所以我喜欢这个解决方案。它更具可读性。
【解决方案4】:

SELECT * FROM table where Date(col) = 'date'

【讨论】:

  • 例如“日期”可以是 2012-12-25 并且 (col) 是您的列
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 2022-06-10
  • 2013-05-05
  • 2011-07-17
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
相关资源
最近更新 更多