MySQL比较DATE字符串和DATETIME字段中的字符串


89

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


159

使用以下内容:

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

仅供参考,我有200万个记录表,我运行了类似的查询。Salils回答花了4.48秒,上面花了2.25秒。

因此,如果表很大,我建议这样做。


8
第一个答案太慢了,因为它必须在比较之前将每个日期时间格式化为字符串。您更好,因为它只直接比较字段中的日期部分,但仍然不能使用索引(在mysql 5.1上测试)
Marki555 2014年

1
如果性能是一个问题,则可能值得考虑单独存储日期和时间部分,以便可以在日期部分放置一个INDEX。
Thijs Riezebeek

1
如果startTime已建立索引,此查询将无法使用索引。
Zamrony P. Juhara,

41

如果要选择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上使用索引,该索引在表增长时将变得很重要。


9
David的版本不好,它不能使用索引。要使用一个索引,你要过滤的列直接,而不是一个函数(的结果date()year()datediff()或任何类似)
Marki555

我一直在寻找mysql如何将日期转换为datetime,感谢您将其清除00:00:00。现在我的结果很有意义
会计م17年

1
与其他无法使用索引(如果可用)的答案相比,这是正确的快速解决方案
Zamrony P. Juhara

23
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = '2010-04-29'"

要么

SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29'

23
这是一个糟糕的查询。不惜一切代价避免这种情况。如果startTime上有一个索引,则此查询无法使用它,因为它是对列应用函数而不是直接使用它。这意味着像这样的任何查询都将需要全表扫描。在大表上,这将意味着查询非常慢。
steveayre 2013年

我同意,他的答案是错误的 -正确的答案由戴维(David)在下面发布。
mindplay.dk

1
请使用大卫的答案,因为它的速度更快。这是有效的,但不利于速度...
xarlymg89

1
@CarlosAlbertoMartínezGadea这个版本很慢,因为它必须在比较之前将每个值格式化为字符串... David的版本不需要它,但是仍然不能使用索引,因此不是最佳的。请参阅XL_的答案以获取可以使用索引的版本。不幸的是,没有更好的方法可以在mysql中正确执行
Marki555 2014年

1
我对这个答案不满意,因为查询无法使用索引,而@XL_的答案却使用索引。
pedromanoel 2014年

2
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT('2014-11-24 10:48:09','%Y-%m-%d %H:%i:%s')

这对于日期时间格式在mysql中使用DATE_FORMAT(date,format)


1
SELECT * FROM `calendar` WHERE DATE(startTime) = '2010-04-29';

它有帮助,您可以像DATE在比较之前那样转换值。


0

您可以将DATETIME字段转换为DATE,如下所示:

SELECT * FROM `calendar` WHERE CAST(startTime AS DATE) = '2010-04-29'

这非常有效。


1
不,它也不是很有效。如果startTime被索引
则将

-6
SELECT * FROM `calendar` WHERE startTime like '2010-04-29%'

如果您想在日期之前或之后查找内容,还可以在MySQL日期上使用比较运算符。这是因为它们以这种方式(最大值到带有前导零的最小值)来编写,因此简单的字符串排序可以正确地对其进行排序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.