mysql:str\ to\ date转换后查询没有结果

ugmeyewa  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(397)

我有一个表,其中一列上有字符串,字符串的格式是iso8601(with 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')

我没有结果,即使我在“上次装运日期”列中有相同格式和范围的日期(6月27日之后),例如:2020-08-09t06:59:59z
我错过了什么?为什么在str\u-to\u-date转换后不能选择行?
谢谢您。

k4ymrczo

k4ymrczo1#

您的代码有两个问题:
(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'
3duebb1j

3duebb1j2#

您的第一项工作应该是修复数据模型,并将日期存储为日期而不是字符串。使用正确的数据类型,您甚至不会面临这个问题。
也就是说:在筛选的列上不应用函数总是会更快。字符串日期的格式可用于比较和排序,因此您更希望将参数转换为目标格式:

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

这个 predicate 将利用 last_ship_date .

ca1c2owp

ca1c2owp3#

ISO8601日期/时间格式的一个优点是它们可以按字典进行比较。所以没必要打电话 STR_TO_DATE() 首先。只需添加 T 分隔符和 Z 区域到要与之比较的字符串。

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

相关问题