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';
4

2 回答 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 日期时间格式,则只需将输入转换为这种格式即可进行匹配。由于您的字段数据已经采用这种格式,您将能够使用索引进行搜索。

于 2013-07-15T17:03:58.773 回答
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')
于 2013-07-15T17:05:06.653 回答