我有一个错误构造的查询,将函数'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()' |
我知道我们应该修复查询:),但是我想问一下是否有人知道这背后的原因,当这个被改变时,以及是否可以配置这种行为?
答案 0 :(得分:1)
不要使用引号:'NOW()'
;只需说NOW()
。
前者是字符串,它不是有效的日期时间。 (同上[{1}}和'NOW'
。)
答案 1 :(得分:0)
Type Conversion in Expression Evaluation声明的文档:
如果其中一个参数是
TIMESTAMP
或DATETIME
列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。
但这似乎不是在这种情况下发生的事情,所以它可能是一个错误。它似乎正在将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
。