MySQLSELECTWHERE 日期时间匹配日(不一定是时间)

我有一个包含日期时间列的表。我希望返回所有记录的一个给定的一天,无论时间。或者换句话说,如果我的表只包含以下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
431290 次浏览

... WHERE date_column >='2012-12-25' AND date_column <'2012-12-26'可能比 DATE工作得更好(如果在 date _ column 上有索引的话)。

永远不要使用像 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'

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

剪辑

正如使用者指出的那样,自从2012年最初的答案出现以来,已经出现了 MySQL 的版本,在这些版本中,使用“23:59:59”作为日结束不再安全。更新后的版本应为

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

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

你可以使用 %:

SELECT * FROM datetable WHERE datecol LIKE '2012-12-25%'
SELECT * FROM `table` where Date(col) = 'date'

和 Eugene Ricks 说的很像。如果在 Java8及以上版本中使用 spring data/jpa,则可以使用 plusDays (长时间)将第25天增加到第26天。

例如:

LocalDateTime lowerDateTime=LocalDateTime.parse("2012-12-25T00:00:00");
LocalDateTime upperDateTime = lowerDateTime.plusDays(1l);
System.out.println("my lowerDate =="+lowerDateTime);
System.out.println("my upperDate=="+upperDateTime);