我有一个表,其中只有DateTime以ISO格式存储为varchar。我想知道将给定的任何iso格式的随机DateTime与存储在表中的DateTime(在varchar中)进行比较的MySQL查询是什么。
答案 0 :(得分:2)
SELECT
STR_TO_DATE('2020-01-03 17:35:48', GET_FORMAT(DATETIME,'ISO')) <
STR_TO_DATE('2020-02-01 00:00:00', GET_FORMAT(DATETIME,'ISO'));
GET_FORMAT(DATETIME,'ISO')
与%Y-%m-%d %H:%i:%s
类似,您也可以这样做:
SELECT
STR_TO_DATE('2020-01-03 17:35:48', '%Y-%m-%d %H:%i:%s') <
STR_TO_DATE('2020-02-01 00:00:00', '%Y-%m-%d %H:%i:%s');
一旦有了DateTime
,就可以使用所有运算符进行比较:=
,<
,<=
,>
,>=
,!=
,BETWEEN
,...
注意:避免将日期/时间存储在VARCHAR
列中,因为:
STR_TO_DATE(mydate)
,这将导致全表扫描。索引将包含mydate
,但不包含STR_TO_DATE(mydate)
的结果,这意味着将不使用该索引。另一种选择是避免转换为日期,并受益于可以使用ASCII比较对ISO格式进行排序的事实。在您的特定情况下,您可以执行以下操作:
SELECT *
FROM TABLE
WHERE traceTime < '2020-02-21T08:40:07.749060'
但是,如果 traceTime 类型为DATETIME
,则查询会是相同的。
答案 1 :(得分:0)
在mysql中,您可以使用
轻松地在日期时间转换字符串 str_to_date(your_string, your_format)
str_to_date('31-12-2019', '%d-%m-%Y')
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_str-to-date
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format