64

例如,以下查询可以正常工作:

SELECT * 
  FROM quotes 
 WHERE expires_at <= '2010-10-15 10:00:00';

但这显然是在执行“字符串”比较——我想知道 MySQL 中是否内置了一个专门进行“日期时间”比较的函数。

4

3 回答 3

121

...这显然是在执行“字符串”比较

否 - 如果日期/时间格式与支持的格式匹配,MySQL 会根据要与之比较的列执行隐式转换以将值转换为 DATETIME。同样的事情发生在:

WHERE int_column = '1'

...其中“1”的字符串值转换为 INTeger,因为int_column的数据类型是 INT,而不是 CHAR/VARCHAR/TEXT。

如果要将字符串显式转换为 DATETIME,则STR_TO_DATE 函数将是最佳选择:

WHERE expires_at <= STR_TO_DATE('2010-10-15 10:00:00', '%Y-%m-%d %H:%i:%s')
于 2010-10-21T15:57:22.523 回答
21

但这显然是在执行“字符串”比较

不会。字符串将自动转换为 DATETIME 值。

11.2。表达式求值中的类型转换。

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。一些转换是隐式发生的。例如,MySQL 会根据需要自动将数字转换为字符串,反之亦然。

于 2010-10-21T15:57:19.480 回答
0

我知道它已经很老了,但我只是遇到了这个问题,而且我在 SQL doc 中看到了:

[为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,] 使用 CAST() 将值显式转换为所需的数据类型。示例:如果将 DATETIME 与两个 DATE 值进行比较,请将 DATE 值转换为 DATETIME 值。如果在与 DATE 的比较中使用字符串常量(例如 '2001-1-1'),请将字符串转换为 DATE。

我认为使用 STR_TO_DATE 更好,因为他们花时间为此创建一个函数,而且我在 BETWEEN 文档中找到了这个事实......

于 2016-08-10T08:13:53.970 回答