比较日期列和日期时间/时间字符串

时间:2017-11-29 20:45:42

标签: mysql mysql-5.7

我有一个包含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选择对列值进行类型转换而不是常量,或者是否还有其他事情发生在这里。

1 个答案:

答案 0 :(得分:2)

我认为你没有正确地解释文档。您引用的第一页是将DATETIMETIMESTAMP与常量进行比较。您正在将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进行比较,因为隐式转换适用于不太精确的值。您不希望4242.1匹配,同样您也不应期望2017-11-242017-11-24 00:00:01匹配。