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'
我有一个 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'