Mysql 比较日期列和 datetime/time 字符串时的隐式转换

Mysql implicit conversion when comparing date column and datetime/time string

我有一个 table 和 Date 列。它有一行 my_date 列的值为 2017-11-24

SELECT * FROM mytable WHERE my_date = '2017-11-24 00:00:00'returns那一行。

SELECT * FROM mytable WHERE my_date = '2017-11-24 00:00:01' 没有。

来自 mysql 文档; this page

If one of the arguments is a TIMESTAMP or DATETIME column and the other argument is a constant, the constant is converted to a timestamp before the comparison is performed. This is done to be more ODBC-friendly. This is not done for the arguments to IN().

如果我对此的解释正确,在第二个查询中,右侧的常量将隐式转换为 Date 字段

铸造的 second page 说 -

Conversion to a DATE value takes fractional seconds into account and rounds the time part. For example, '1999-12-31 23:59:59.499' becomes '1999-12-31', whereas '1999-12-31 23:59:59.500' becomes '2000-01-01'.

示例显示1999-12-31 23:59:59.499 -> 1999-12-31。我知道显式转换是首选,但我想知道为什么 mysql 选择对列值而不是常量进行类型转换,或者这里是否发生了其他事情。

我认为您没有正确解释文档。您引用的第一页是关于将 DATETIMETIMESTAMP 与常量进行比较。您正在将 DATE 与常量进行比较,因此 this logic 应该适用:

Conversion of DATE values:

Conversion to a DATETIME or TIMESTAMP value adds a time part of '00:00:00' because the DATE value contains no time information.

所以这就像比较 '2017-11-24 00:00:00' = '2017-11-24 00:00:01' 明智地 returns 错误。

将 DATE 与 DATETIMEs/TIMESTAMPs 进行比较类似于将 int 与 double 进行比较,因为隐式转换适用于 不太精确的 值。您不会期望 42 匹配 42.1,同样您也不应该期望 2017-11-24 匹配 2017-11-24 00:00:01.