选择记录,其中日期时间大于指定日期。

6

问题

我试图通过运行下面提到的查询语句,从表中获取所有记录,其中 date_time 字段大于 'Thu, 11 Jul 2013'。date_time 字段中的值存储在这个格式 => Thu, 11 Jul 2013 08:29:37中。希望能得到帮助。

字段 date_time 的数据类型为varchar

查询语句

SELECT * FROM table_name 
WHERE username = 'mark@example.com' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= 'Thu, 11 Jul 2013 00:00:00';

请验证 date_time 的数据类型。它是 varchar 还是 date? - Dan Bracuk
2
你需要把字符串转换为日期,而不是日期转换为字符串。 - Barranka
@Barranka 如果您不介意的话,能否给我一个例子? - colourtheweb
2个回答

7
这是又一个很好的例子,说明为什么应该使用MySQL中的日期、日期时间或时间戳字段类型来实现日期/时间字段,并让应用程序处理如何格式化输出日期。

目前,您需要进行以下操作:
SELECT * FROM table_name 
WHERE username = 'mark@example.com' 
AND STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s');

这个查询不能使用你在date_time字段上的任何索引,因此这个查询将非常低效。它需要执行全表扫描,转换每一行的值以便进行比较。

你应该做的是:

SELECT * FROM table_name 
WHERE username = 'mark@example.com' 
AND date_time >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s');

如果您的MySQL字段已经是datetime格式,您只需要将输入转换为此格式以进行匹配。由于您的字段数据已经是这种格式,因此您可以利用索引进行搜索。


6

您正在尝试将日期与字符串进行比较。

str_to_date函数应用是正确的,但您没有与日期进行比较。

正确的方法是:

select * from yourTable
where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= '2013-07-11 00:00:00'

请注意日期格式为YYYY-MM-DD HH:mm:ss(这是MySQL默认的日期格式)。

当然,你也可以与str_to_date的结果进行比较:

... where STR_TO_DATE(date_time, '%a, %e %b %Y %H:%i:%s') >= STR_TO_DATE('Thu, 11 Jul 2013 00:00:00', '%a, %e %b %Y %H:%i:%s')

我认为第二个查询中有一个多余的 where?如果没有,请解释一下语法。 - user645280
@ebyrob 谢谢...只是一个打字错误。 - Barranka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接