我有一个包含Date
列的表格。它有一行,my_date
列的值为2017-11-24
SELECT * FROM mytable WHERE my_date = '2017-11-24 00:00:00'
返回该行。
虽然SELECT * FROM mytable WHERE my_date = '2017-11-24 00:00:01'
没有。
来自mysql doc; this page说
如果其中一个参数是TIMESTAMP或DATETIME列,那么 其他参数是常量,常量转换为时间戳 在进行比较之前。这样做更多 ODBC友好。这不是针对IN()的参数。
如果我正确地解释了这一点,在第二个查询中,右侧的常量将隐式地转换为Date
字段
投射的second page说 -
转换为DATE值需要考虑小数秒 围绕时间部分。例如,' 1999-12-31 23:59:59.499'变 ' 1999-12-31',而' 1999-12-31 23:59:59.500'成为' 2000-01-01'。
示例显示1999-12-31 23:59:59.499 -> 1999-12-31
。我理解显式转换是首选,但我想知道为什么mysql选择对列值进行类型转换而不是常量,或者是否还有其他事情发生在这里。
答案 0 :(得分:2)
我认为你没有正确地解释文档。您引用的第一页是将DATETIME
或TIMESTAMP
与常量进行比较。您正在将DATE
与常量进行比较,因此this logic应该适用:
转换DATE值:
转换为DATETIME或TIMESTAMP值会添加'00:00:00'的时间部分,因为DATE值不包含时间信息。
所以这就像比较明智地返回假的'2017-11-24 00:00:00' = '2017-11-24 00:00:01'
。
将DATE与DATETIME / TIMESTAMPs进行比较类似于将int与double进行比较,因为隐式转换适用于不太精确的值。您不希望42
与42.1
匹配,同样您也不应期望2017-11-24
与2017-11-24 00:00:01
匹配。