MySQL将DATE字符串与DATETIME字段中的字符串进行比较

时间:2010-05-03 13:49:59

标签: mysql datetime comparison

我有一个问题:是否可以通过将一个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”的行。

有什么建议吗?感谢。

7 个答案:

答案 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日期使用比较运算符。这是因为它们以这样的方式编写(最大值到最小值,前导零),简单的字符串排序将对它们进行正确排序。