我有一个问题:是否可以通过将一个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”的行。
有什么建议吗?感谢。
答案 0 :(得分:132)
使用以下内容:
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
仅供参考,我有一个200万的记录表,我运行了类似的查询。 Salils回答需要4.48秒,上面花了2.25秒。
所以,如果表格很大,我会建议这样做。
答案 1 :(得分:30)
如果要选择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上使用索引,这将在表增长时变得很重要。
答案 2 :(得分:20)
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"
OR
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'
答案 3 :(得分:2)
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';
有帮助,您可以在比较之前将值转换为DATE
。
答案 4 :(得分:1)
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')
这是使用DATE_FORMAT(date,format)
的mysql中的datetime格式。
答案 5 :(得分:0)
您可以将DATETIME字段转换为DATE:
SELECT * FROM `calendar` WHERE CAST(startTime AS DATE) = '2010-04-29'
这非常有效率。
答案 6 :(得分:-6)
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'
如果您想在之后或之前找到某些内容,您还可以在MySQL日期使用比较运算符。这是因为它们以这样的方式编写(最大值到最小值,前导零),简单的字符串排序将对它们进行正确排序。