我有一个表,其中一列上有字符串,字符串的格式是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转换后不能选择行?
谢谢您。
3条答案
按热度按时间k4ymrczo1#
您的代码有两个问题:
(1) 列
last_ship_date
包含在单引号中,因此它被视为字符串文本而不是列名(2) 必须使用第二个日期的格式
%H
而不是%h
因为你专栏里的小时是24小时制的。因此,请改为:
但也可以简化为:
3duebb1j2#
您的第一项工作应该是修复数据模型,并将日期存储为日期而不是字符串。使用正确的数据类型,您甚至不会面临这个问题。
也就是说:在筛选的列上不应用函数总是会更快。字符串日期的格式可用于比较和排序,因此您更希望将参数转换为目标格式:
这个 predicate 将利用
last_ship_date
.ca1c2owp3#
ISO8601日期/时间格式的一个优点是它们可以按字典进行比较。所以没必要打电话
STR_TO_DATE()
首先。只需添加T
分隔符和Z
区域到要与之比较的字符串。