Mysql: STR_TO_DATE 转换后查询无结果

Mysql: No results on query after STR_TO_DATE conversion

我有一个 table,其中一列有字符串,字符串的格式是 ISO 8601(带 TZ)。

当我尝试运行以下查询时:

select * from `orders` where STR_TO_DATE('last_ship_date', '%Y-%m-%dT%TZ') >= STR_TO_DATE('2020-06-27 21:13:14', '%Y-%m-%d %h:%i:%s')

我没有结果,即使我在:“last_ship_date”列中具有相同格式和范围(6 月 27 日之后)的日期,例如:2020-08-09T06:59: 59Z

我在这里错过了什么?为什么在 STR_TO_DATE 转换后我不能 select 行?

谢谢。

您的代码有 2 个问题:

(1) 列 last_ship_date 括在单引号中,因此它被视为字符串文字而不是列的名称

(2) 在第二个日期的格式中,您必须使用 %H 而不是 %h,因为您列中的小时采用 24 小时格式。

所以改成这样:

select * from `orders` 
where STR_TO_DATE(last_ship_date, '%Y-%m-%dT%TZ') >= 
      STR_TO_DATE('2020-06-27 21:13:14', '%Y-%m-%d %H:%i:%s')

但您也可以简化为:

select * from `orders` 
where STR_TO_DATE(last_ship_date, '%Y-%m-%dT%TZ') >= '2020-06-27 21:13:14'

您的首要工作应该是修复您的数据模型,并将日期存储为日期而不是字符串。使用正确的数据类型,您甚至不会遇到这个问题。

就是说:不在过滤的列上应用函数总是更快。您的字符串日期具有可用于比较和排序的格式,因此您宁愿将参数转换为目标格式:

select * 
from `orders`
where last_ship_date = DATE_FORMAT('2020-06-27 21:13:14', '%Y-%m-%dT%H:%i:%sZ')

此谓词将利用 last_ship_date 上的索引。

ISO 8601 date/time 格式的好处之一是它们可以按字典顺序进行比较。所以没有必要首先调用 STR_TO_DATE() 。只需将 T 分隔符和 Z 区域添加到要与之比较的字符串即可。

select * from `orders` 
where last_ship_date' >= '2020-06-27T21:13:14Z'