MySQL SELECT WHERE datetime匹配日期(不一定是时间)

use*_*531 118 mysql select date

我有一个包含datetime列的表.无论时间如何,我希望返回给定日期的所有记录.或者换句话说,如果我的表只包含以下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
Run Code Online (Sandbox Code Playgroud)

Eug*_*eck 304

永远不要使用像这样的选择器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'
Run Code Online (Sandbox Code Playgroud)

因为这将允许索引使用而无需计算.

编辑

正如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'
Run Code Online (Sandbox Code Playgroud)

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

  • @KonradViltersten - 更好的是:`WHERE col> ='2012-12-25'and col <'2012-12-25'+ INTERVAL 1 DAY`.它避免了0次,适用于"DATE","DATETIME","DATETIME(6)"等.并处理闰日等. (6认同)
  • '2012-12-25 23:59:59' 作为一天结束是无效的,这总是一个坏主意,它会导致支持亚秒级时间精度的 MySQL 版本出现错误。使用 Rick James(上图)或 a1ex07(其他答案)的方法要好得多 (3认同)
  • 刚刚在两台服务器上进行了测试,上面比date()=''快了很多(至少10倍),特别是对于大型桌子.谢谢 (2认同)

a1e*_*x07 31

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'可能更好地工作(如果你有date_column上的索引)比DATE.

  • 它应该没有任何区别.`BETWEEN`只是一种写`field> = value1和fied <= value2`的方法. (6认同)

Ghi*_*ADJ 19

你可以使用%:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'
Run Code Online (Sandbox Code Playgroud)

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