如何从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-20datetime LIKE '2009-10-20%'
=> 2931ms - using
datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
00:00:00'anddatetime >= '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时间,它应该在这种情况下工作