如何从datetime列中selectdate?

我有一个types为“datetime”的列,其值为2009-10-20 10:00:00

我想从date时间提取date,并写下如下查询:

SELECT * FROM data WHERE datetime = '2009-10-20' ORDER BY datetime DESC 

以下是最好的办法吗?

 SELECT * FROM data WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59') ORDER BY datetime DESC 

然而这返回一个空的结果集。 有什么build议么?

 WHERE DATE(datetime) = '2009-10-20' 

或者试试这个,看看它是否工作不。 这有帮助吗?

WHERE datetime LIKE '2009-10-20%'

你需要检查它是否工作。

使用WHERE DATE(datetime) = '2009-10-20' 有性能问题 。 如此处所述:

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

使用BETWEEN><=运算符允许使用索引:

 SELECT * FROM data WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59' 

更新:对索引列中使用LIKE而不是操作符的影响 很高 。 这些是一个有1,176,000行的表格上的一些testing结果:

  • 使用datetime LIKE '2009-10-20%' LIKE'2009-10-20 datetime LIKE '2009-10-20%' => 2931ms
  • using datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59' 00:00:00'and datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59' => 168ms

当通过同一查询进行第二次调用时,差异甚至更高:2984ms vs 7ms(是的,只有7毫秒!)。 我在使用Hibernate重写项目中的一些旧代码时发现了这个问题。

您可以将date时间格式化为YMD部分:

 DATE_FORMAT(datetime, '%Y-%m-%d') 

虽然页面上的所有答案都会返回所需的结果,但它们都有性能问题。 切勿对WHERE子句中的字段执行计算(包括DATE()计算),因为必须对表中的所有行执行计算。

BETWEEN ... AND结构对于两个边界条件都是包含性的,需要在结束date指定23:59:59的语法,这个语法本身还有其他问题(微秒事务,我相信MySQL在2009年不支持这个问题被问)。

查询特定date的MySQL timestamp字段的正确方法是检查所需date的大于等于,小于等于一天之后,没有指定小时。

 WHERE datetime>='2009-10-20' AND datetime<'2009-10-21' 

这是性能最快,内存最less,资源最less的方法,并且还支持所有MySQLfunction和angular落情况,如亚秒级时间戳精度。 另外,这是未来的certificate。

您可以使用:

 DATEDIFF ( day , startdate , enddate ) = 0 

要么:

 DATEPART( day, startdate ) = DATEPART(day, enddate) AND DATEPART( month, startdate ) = DATEPART(month, enddate) AND DATEPART( year, startdate ) = DATEPART(year, enddate) 

要么:

 CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105)) 

简单和最好的方式来使用datefunction

 SELECT * FROM data WHERE date(datetime) = '2009-10-20' 

要么

 SELECT * FROM data WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20' 

那么,像在声明中使用是最好的select,像“2009-10-20%”date时间,它应该在这种情况下工作