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 选择对列值而不是常量进行类型转换,或者这里是否发生了其他事情。
我认为您没有正确解释文档。您引用的第一页是关于将 DATETIME
或 TIMESTAMP
与常量进行比较。您正在将 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
.
我有一个 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 选择对列值而不是常量进行类型转换,或者这里是否发生了其他事情。
我认为您没有正确解释文档。您引用的第一页是关于将 DATETIME
或 TIMESTAMP
与常量进行比较。您正在将 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
.