例如,以下查询可以正常工作:
SELECT *
FROM quotes
WHERE expires_at <= '2010-10-15 10:00:00';
但这显然是在执行“字符串”比较——我想知道 MySQL 中是否内置了一个专门进行“日期时间”比较的函数。
例如,以下查询可以正常工作:
SELECT *
FROM quotes
WHERE expires_at <= '2010-10-15 10:00:00';
但这显然是在执行“字符串”比较——我想知道 MySQL 中是否内置了一个专门进行“日期时间”比较的函数。
...这显然是在执行“字符串”比较
否 - 如果日期/时间格式与支持的格式匹配,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')
但这显然是在执行“字符串”比较
不会。字符串将自动转换为 DATETIME 值。
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。一些转换是隐式发生的。例如,MySQL 会根据需要自动将数字转换为字符串,反之亦然。
我知道它已经很老了,但我只是遇到了这个问题,而且我在 SQL doc 中看到了:
[为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,] 使用 CAST() 将值显式转换为所需的数据类型。示例:如果将 DATETIME 与两个 DATE 值进行比较,请将 DATE 值转换为 DATETIME 值。如果在与 DATE 的比较中使用字符串常量(例如 '2001-1-1'),请将字符串转换为 DATE。
我认为使用 STR_TO_DATE 更好,因为他们花时间为此创建一个函数,而且我在 BETWEEN 文档中找到了这个事实......