【问题标题】:Time difference between CURRENT_TIMESTAMP(), CURRENT_DATE() + 0 and CURRENT_DATE()CURRENT_TIMESTAMP()、CURRENT_DATE() + 0 和 CURRENT_DATE() 之间的时间差
【发布时间】:2019-08-15 10:47:08
【问题描述】:

当我执行这个查询时:

SELECT CURRENT_TIMESTAMP(),CURRENT_DATE()+0,CURRENT_DATE;

我得到这个结果:

CURRENT_TIMESTAMP(), CURRENT_DATE()+0, CURRENT_DATE
2019-03-25 08:54:33, 20190325        , 2019-03-24

为什么 CURRENT_DATE 和 CURRENT_DATE + 0 之间存在差异?

我的服务器版本是:15.1 Distrib 10.1.37-MariaDB,debian-linux-gnu (x86_64) 使用 readline 5.2

感谢您的任何建议:)

【问题讨论】:

  • 我无法重现该问题:dbfiddle.uk/…
  • @Nick 我认为2019-03-24 是复制错字。
  • @TimBiegeleisen 不,这是区域设置差异。为我工作。
  • 语言环境差异如何解释当前时间戳和当前日期之间的不同日历日? (嗨,EJP,顺便说一句,如果是你的话)
  • @TimBiegeleisen 因为时区一开始。 [EJP]

标签: mysql


【解决方案1】:

如果您想在 MySQL 日期上添加一些天数,那么您应该使用 INTERVAL,例如

CURRENT_DATE() + INTERVAL 0 DAY

但是,由于您实际上是 MySQL 日期的整数,所以这里有一个解释。 CURRENT_DATE() 是日期,而 CURRENT_DATE() + 0 以数字结尾。您当前的查询:

SELECT CURRENT_DATE() + 0;

实际上是这样评估的:

SELECT (CAST CURRENT_DATE() AS UNSIGNED) + 0;

强制转换为整数是必要的,因为您将零(一个整数)添加到 CURRENT_DATE() 的结果中。

通过运行来说服自己:

SELECT (CAST CURRENT_DATE() AS UNSIGNED);

这将返回 20180325 作为结果。

【讨论】:

  • 是否值得指出 CURRENT_DATE() + INTERVAL 0 DAY 是进行日期数学的适当方式?
  • 嗨,我明白 - 我的问题是为什么当我做 CURRENT_DAY 我得到 3 月 24 日而当我做 CURRENT_DAY+0 我得到 3 月 25 日时会有日期差异。 :)
  • @JakubKužílek 你确定这是可重现的吗?我无法重现你的行为,see this demo
  • @TimBiegeleisen 我不确定,我也不知道为什么会这样,所以我问:)
【解决方案2】:

我同意结果可能有点令人惊讶。您将零添加到日期并期望它保持该日期。但是,这意味着您添加零“某物”,例如零 小时 或零 (否则:+1 是否意味着日期?)。

有 DBMS 可以做到这一点。例如,在 Oracle 中,somedate + 1 表示 somedate + interval '1' day。然而,MySQL 没有。 MySQL 而是将数字(在您的情况下为零)添加到日期的内部数字表示中。他们为什么这样做,超出了我的理解。为什么我们要查看 MySQL 在内部使用什么来存储日期?对我们来说应该没关系。所以 MySQL 所做的就是将 CURRENT_DATE 转换为数值,然后加零,这就是为什么你会在结果中看到一个数字。

您可以从中学到:不要在日期中添加数字,因为它实际上没有任何意义。什么是 2008 年 10 月 3 日加 23(相对于“加 23 天”或“加 23 周”或其他)?它没有任何意义。因此,将其视为 DBMS 中的一个缺陷,甚至允许这样做并且永远不要使用它。

您当然可以随时为日期添加间隔,例如

select current_date + interval 0 day;

【讨论】:

  • @Tim Biegeleisen:我的观点是另一个。我发布此内容是为了表明人们不应该在日期中添加数字,因为这没有任何意义。 OP应该问自己他们想通过在日期中添加一个数字来表达什么,并用一个间隔写一个适当的表达式。 MySQL 不应该透露存储内部结构,在我看来,日期不应该隐式转换为某个数字。
  • 谢谢。这很有趣。您能解释一下为什么 3 月 25 日的 CURRENT_TIMESTAMP 日期与 3 月 24 日的 CURRENT_DAY 日期不同吗?
  • 糟糕,我以为这是一个错字。对不起。如果CURRENT_TIMESTAMPCURRENT_DAY 返回不同的日期,我认为这是一个错误。 MySQL 文档说:“CURRENT_TIMESTAMP()、CURRENT_TIME()、CURRENT_DATE() 和 FROM_UNIXTIME() 函数返回当前会话时区的值”(此处为:dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html)。您使用的不是 MySQL,而是 MariaDB,但这应该没什么区别。
  • 嗨,谢谢,但我有点困惑,为什么两个函数会返回两个具有相似时区的不同日期值......或者我不知道,是否可以有两个不同的时区在一个sql查询:)
  • 正如我所说:如果两个函数在同一个查询中返回不同的日期,我认为这是一个错误
【解决方案3】:

我想我找到了答案 - 问题在于我正在使用的 dataGrip 桌面客户端。我不确定数据到底发生了什么,但似乎 a) dataGrip 以某种方式与不正确的时区建立了连接,或者 b) 在接收时错误地转换了数据。在你问之前,我通过终端、MySQL 工作台和 MySQL 服务器本身尝试了相同的查询,我得到了正确的答案。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多