我有一个问题:是否可以通过将一个DATE字符串“ 2010-04-29”与以DATETIME(2010-04-29 10:00)存储的字符串进行比较来从MySQL数据库中进行选择?
我有一个日期选择器可以过滤数据,我想按DATETIME字段查询表,如下所示:
SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"
...,我想获得DATETIME值为“ 2010-04-29 10:00”的行。
有什么建议?谢谢。
我有一个问题:是否可以通过将一个DATE字符串“ 2010-04-29”与以DATETIME(2010-04-29 10:00)存储的字符串进行比较来从MySQL数据库中进行选择?
我有一个日期选择器可以过滤数据,我想按DATETIME字段查询表,如下所示:
SELECT * FROM `calendar` WHERE startTime = '2010-04-29'"
...,我想获得DATETIME值为“ 2010-04-29 10:00”的行。
有什么建议?谢谢。
Answers:
使用以下内容:
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
仅供参考,我有200万个记录表,我运行了类似的查询。Salils回答花了4.48秒,上面花了2.25秒。
因此,如果表很大,我建议这样做。
startTime
已建立索引,此查询将无法使用索引。
如果要选择DATETIME列的DATE部分与某个文字匹配的所有行,则不能这样做:
WHERE startTime = '2010-04-29'
因为MySQL无法直接比较DATE和DATETIME。MySQL所做的是,它使用时间'00:00:00'扩展了给定的DATE文字。所以你的情况变成
WHERE startTime = '2010-04-29 00:00:00'
当然不是您想要的!
该条件是一个范围,因此应将其指定为范围。有几种可能性:
WHERE startTime BETWEEN '2010-04-29 00:00:00' AND '2010-04-29 23:59:59'
WHERE startTime >= '2010-04-29' AND startTime < ('2010-04-29' + INTERVAL 1 DAY)
第一个错误的可能性很小-当您的DATETIME列使用亚秒级分辨率并且约会时间为23:59:59 + epsilon时。通常,我建议使用第二种变体。
两种变体都可以在startTime上使用索引,该索引在表增长时将变得很重要。
date()
,year()
,datediff()
或任何类似)
00:00:00
。现在我的结果很有意义
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"
要么
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'