【发布时间】:2016-07-19 19:24:21
【问题描述】:
我的查询构造错误,将函数“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()' |
我知道我们应该修复查询 :),但我想问一下是否有人知道这背后的原因,何时更改,以及是否可以配置此行为?
【问题讨论】:
-
这看起来不像我观察到的行为;看起来任何日期时间都小于
'now()'。SELECT (now() + INTERVAL 10 SECOND) < 'now()', (now() + INTERVAL 10 SECOND) > 'now()'产生 (1, 0)。 -
我发现任何字符串文字都会与日期字段进行“有效”比较。
SELECT * FROM mypasswords WHERE expires < 'ndseow'不返回任何记录。SELECT * FROM mypasswords WHERE expires > 'ndseow'全部返回。如果您看到的行为是正确的,那可能是巧合。 -
@Uueerdo 我做到了,得到了你的结果,它也给出了警告
Truncated incorrect datetime value: 'now()'。 -
它似乎将日期时间转换为字符串,产生类似
2016-07-19 01:23:45,然后将该字符串与now()进行比较。但是documentation 表示它应该将常量字符串转换为datetime然后比较它们。 -
谢谢,这一切都非常有帮助。我没有注意到差异,因为使用 'now()' 和 now() 我们得到了相同的结果。