CURRENT_TIMESTAMP(),CURRENT_DATE()+ 0和CURRENT_DATE()之间的时差

时间:2019-03-25 08:18:18

标签: mysql

当我执行此查询时:

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使用readline 5.2分发debian-linux-gnu(x86_64)的10.1.37-MariaDB

谢谢您的任何建议:)

3 个答案:

答案 0 :(得分:0)

如果要在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

答案 1 :(得分:0)

我同意结果可能有些令人惊讶。您将一个零添加到一个日期,并希望它保持该日期。但是,这意味着您要添加零“内容”,例如零 hours 或零 days (否则:+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;

答案 2 :(得分:0)

我想我找到了答案-问题出在我使用的dataGrip桌面客户端上。我不确定数据到底发生了什么,但似乎a)dataGrip某种程度上使连接的时区不正确,或者b)接收时不正确地转换了数据。在您问之前,我通过终端,MySQL工作台以及在MySQL服务器本身上尝试了相同的查询,并且得到了正确的答案。 :)