减去时间戳差异

时间:2014-09-18 19:56:37

标签: mysql

我有一个持久化进程,它检查数据库表中的一行,并根据子进程的最后一次生成(基本上是一个非常简单的CRON替换)在某个时间间隔产生子进程。

我最初实现它,只是从last_start列中存储的值中减去当前时间戳。 CURRENT_TIMESTAMP - last_start。这个似乎起作用了,然而,仔细检查发现时间戳减法行为相当奇怪。

当我们越过分钟障碍(因此,当前时间到达新的一分钟)时,似乎&#34;差异&#34;计算出来的数字会增加40(例如从59增加到100)。这个看起来像<&#34; 1:00&#34; - 有点 - 直到我们进入如下所示的状态,那里将是&#34;秒&#34;它的一部分超过60(在下面的例子中它是95)。

我通过使用TIMESTAMPDIFF方法进行减法解决了这个问题(感谢Stack Overflow!)。但是我不清楚为什么这首先是不足之处。

mysql db_name -e 'select CURRENT_TIMESTAMP, last_start, CURRENT_TIMESTAMP - last_start , TIMESTAMPDIFF(SECOND, last_start, CURRENT_TIMESTAMP) from tasks where id = 3'      Thu Sep 11 09:49:17 2014

CURRENT_TIMESTAMP     last_start              CURRENT_TIMESTAMP - last_start        TIMESTAMPDIFF(SECOND, last_start, CURRENT_TIMESTAMP)
2014-09-11 09:49:17     2014-09-11 09:37:22   1195                                  715 

当我只是减去时间戳时,有人可以向我解释发生了什么吗?

编辑:表架构如下:

CREATE TABLE `tasks` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `task` char(128) NOT NULL,
  `run_count` int(10) unsigned NOT NULL DEFAULT '0',
  `domina` char(128) DEFAULT NULL,
  `slave` char(128) DEFAULT NULL,
  `last_start` timestamp NULL DEFAULT NULL,
  `last_end` timestamp NULL DEFAULT NULL,
  `avg_duration` int(10) unsigned NOT NULL DEFAULT '0',
  `last_status` char(64) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:2)

为什么会出错?好吧,你会期望一个数据库(或任何其他软件产品)具有一个名为TIMESTAMP和一个&#34;常数&#34;的数据类型。名为CURRENT_TIMESTAMP的人使用前者代表后者。

但不是。那不是MySQL。 CURRENT_TIMESTAMPnow()的同义词,其类型与上下文相关。令人高兴的是,文档非常清楚地解释了这一点:

  

以&#39; YYYY-MM-DD HH:MM:SS&#39;中的值返回当前日期和时间。   或YYYYMMDDHHMMSS格式,具体取决于是否使用该功能   字符串或数字上下文。

当然,你必须弄清楚不同的背景是什么。一个提示。使用-是一个&#34;数字上下文&#34;。

以下是发生的事情。 MySQL看到CURRENT_TIMESTAMP并输入当前时间。但是怎么样?它看到-并确定它作为数字进入。然后它遇到了last_start。好吧,现在也必须将其转换为数字。你猜怎么着?你得到了时髦的行为。