【问题标题】:mysql treats the string 'now()' as datetime?mysql将字符串'now()'视为日期时间?
【发布时间】: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) &lt; 'now()', (now() + INTERVAL 10 SECOND) &gt; 'now()' 产生 (1, 0)。
  • 我发现任何字符串文字都会与日期字段进行“有效”比较。 SELECT * FROM mypasswords WHERE expires &lt; 'ndseow' 不返回任何记录。 SELECT * FROM mypasswords WHERE expires &gt; 'ndseow' 全部返回。如果您看到的行为是正确的,那可能是巧合。
  • @Uueerdo 我做到了,得到了你的结果,它也给出了警告Truncated incorrect datetime value: 'now()'
  • 它似乎将日期时间转换为字符串,产生类似2016-07-19 01:23:45,然后将该字符串与now() 进行比较。但是documentation 表示它应该将常量字符串转换为datetime 然后比较它们。
  • 谢谢,这一切都非常有帮助。我没有注意到差异,因为使用 'now()' 和 now() 我们得到了相同的结果。

标签: mysql mariadb


【解决方案1】:

不要使用引号:'NOW()';简单地说NOW()

前者是一个字符串,它不是一个有效的日期时间。 ('NOW''XYZ' 同上。)

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多