为什么FROM_UNIXTIME可以追溯到1970年?

Jay*_*len 0 mysql intervals

我想要获得2日期之间的间隔.

如果我有'2014-10-31'和'2014-10-10'那么结果必须是'2014-10-21'

这就是我所做的.

SELECT FROM_UNIXTIME(unix_timestamp(CURDATE()) - unix_timestamp('2014-10-10'), '%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)

但这是回归1970-01-22

我想要它返回的是2014-10-21

为什么不起作用?以及如何得到我正在寻找的答案?

先感谢您

Eug*_*eck 5

结果UNIX_TIMESTAMP()是 - 你可能已经猜到了 - 一个UNIX时间戳:一个在1970-01-01 00:00:00 UTC从0开始的整数,从那以后每秒计数一个.重要的是,这个时间尺度上的零既不是0 AD也不是其他历史事件,而是1970年1月1日.

例如,unix_timestamp(CURDATE()) - unix_timestamp('2014-10-10')计算21天的差异(截至发布时间) - 这相当于1970-01-01 + 21天的日期,结果是1970-01-22.

编辑

从评论中的@ Mike的问题来看:减去两个日期给出了一个时间跨度,而不是一个日期.要将其再次解释为日期,您需要将其添加到某个起始时间点.如上所示,UNIX时间戳使用1970-01-01,而格里高利历则使用基督诞生的虚拟年份.要使用它,你会采取

DATE_ADD('0001-01-01', INTERVAL (UNIX_TIMESTAMP(CURDATE()) - UNIX_TIMESTAMP('2014-10-10')) SECOND)
Run Code Online (Sandbox Code Playgroud)

得到正确的价值0001-01-22.

  • @Mike:结果是间隔,而不是日期. (2认同)