在MySQL中比较两个ISO日期时间字符串

时间:2020-02-26 09:07:23

标签: mysql sql string date time

我有一个表,其中只有DateTime以ISO格式存储为varchar。我想知道将给定的任何iso格式的随机DateTime与存储在表中的DateTime(在varchar中)进行比较的MySQL查询是什么。

2 个答案:

答案 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