3

我试图弄清楚 MySQL 在时间戳的数学运算期间在做什么。

结果问题的图片:

在此处输入图像描述

你会在左边看到我有两个时间戳,开始和结束,我需要找到从开始到结束的持续时间,所以我这样做:

结束 - 开始

我得到了一些非常奇怪的结果。您可以看到仅 3 小时的持续时间,我得到的结果表明该数量是该数量的 2 到 3 倍。

当我首先转换为 UTC 时,数学计算结果很好。

谁能解释一下 SQL 对左边的时间戳做了什么?我一直认为所有时间戳都是 UTC 引擎盖下的,这就是为什么像最小值、最大值、小于等这样的东西可以在不转换的情况下工作。

谢谢!

代码:

select  
    min(timestamp) start, 
    max(timestamp) end, 
    max(timestamp) - min(timestamp) start_to_end, 
    unix_timestamp(min(timestamp)) startUTC, 
    unix_timestamp(max(timestamp)) endUTC,
    unix_timestamp(max(timestamp)) - unix_timestamp(min(timestamp)) start_to_end_UTC
from post_snapshots group by permalink;
4

3 回答 3

1

These examples have nothing to do with timezone conversions -- when you subtract one date directly from the other, MySQL generates a integer from all existing date parts and then makes the math operations. For example, this query:

select now()+1;

returns (it was '2013-02-26 14:38:31' + 1):

+----------------+
| now()+1        |
+----------------+
| 20130226143832 |
+----------------+

So the difference between "2013-02-19 16:49:21" and "2013-02-19 19:07:31" turns out to be:

20130219190731 - 20130219164921 = 25810

The correct way for getting this subtraction is to either convert the dates to timestamps (like you did) or to use TIMESTAMPDIFF(SECOND, start_date, end_date), which would return 8290.

于 2013-02-26T17:46:00.167 回答
1

这不是DATETIMEvs.TIMESTAMP或时区问题。

MySQL 通过将每个值转换为数字来将日期时间作为减法(或其他数学运算)的操作数来处理,但它不是秒数,它只是将日期时间数字加在一起。以您的数据为例:

2013-02-19 16:49:21变成20130219164921

2013-02-19 19:07:31变成20130219190731

这两个数字之间的差是... 25810,这是您看到的减法运算结果的值。正如您所指出的,这不是几秒钟内的结果。这实际上并没有多大用处。

相比之下,TIMESTAMPDIFF()(或像您所做的那样预先转换为 Unix 时间戳)实际上使用适合时间的数学来执行差异,如果您正在寻找差异对于排序之外的意义重大:

SELECT TIMESTAMPDIFF(SECOND, '2013-02-19 16:49:21', '2013-02-19 19:07:31')
>>> 8290
于 2013-02-26T17:40:22.083 回答
0

发生的事情是您不能在 mysql 中减去日期/日期时间。对于所有数学运算,mysql 时间戳数据类型的行为类似于 datetime 数据类型。你可以改用

  select  
    TIMESTAMPDIFF(SECOND,min(timestamp),max(timestamp))
  from post_snapshots group by permalink;
于 2013-02-26T17:40:19.603 回答