mysql将字符串'now()'视为datetime?

时间:2016-07-19 19:24:22

标签: mysql mariadb

我有一个错误构造的查询,将函数'now()'包含为字符串:

 select Listing.id,Listing.reactivated FROM `listings` AS Listing  WHERE Listing.reactivated < 'now()';

但实际上这个查询能够使用mysql 5.5返回正确的结果:

|  26662 | 2007-06-04 21:42:51 |
|  26663 | 2007-06-04 21:46:34 |

实际上,有几个日期函数,即使没有括号也可以工作;比如'now'或'curdate',但是一个简单的,“select”now()';“,将返回一个字符串。

实际上,当我们将Mysql升级到MariaDB 10.1时,我注意到了这一点,它停止了工作,上面的查询结果是一个空集,还有一个警告:

| Warning | 1292 | Incorrect datetime value: 'NOW()' |

我知道我们应该修复查询:),但是我想问一下是否有人知道这背后的原因,当这个被改变时,以及是否可以配置这种行为?

2 个答案:

答案 0 :(得分:1)

不要使用引号:'NOW()';只需说NOW()

前者是字符串,它不是有效的日期时间。 (同上[{1}}和'NOW'。)

答案 1 :(得分:0)

Type Conversion in Expression Evaluation声明的文档:

  

如果其中一个参数是TIMESTAMPDATETIME列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。

但这似乎不是在这种情况下发生的事情,所以它可能是一个错误。它似乎正在将DATETIME转换为字符串,并将其与常量进行比较。因此,如果当前日期时间为2016-07-19 15:13:06,则会得到以下结果:

SELECT '2016-07-19 15:13:06' < 'now()';

由于数字低于整理顺序中的字母,因此返回1

我通过尝试其他字符串来得出这个结论:

SELECT NOW() < '300';

这也会返回1。但如果我把它改为:

SELECT NOW() < '100', NOW() < '!';

结果为0