问题
我正在尝试通过运行下面提到的查询从表中获取 date_time 字段大于'星期四,2013年7月11日'的所有记录。 date_time字段中的值存储在此格式=>中星期四,2013年7月11日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';
答案 0 :(得分:6)
这是另一个很好的例子,说明为什么你应该使用日期,日期时间或时间戳字段类型在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日期时间格式,则只需将输入转换为此格式即可进行匹配。由于您的现场数据已采用此格式,因此您可以使用索引进行搜索。
答案 1 :(得分:5)
您正在尝试将日期与字符串进行比较。
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')