我有一个持久化进程,它检查数据库表中的一行,并根据子进程的最后一次生成(基本上是一个非常简单的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
答案 0 :(得分:2)
为什么会出错?好吧,你会期望一个数据库(或任何其他软件产品)具有一个名为TIMESTAMP
和一个&#34;常数&#34;的数据类型。名为CURRENT_TIMESTAMP
的人使用前者代表后者。
但不是。那不是MySQL。 CURRENT_TIMESTAMP
是now()
的同义词,其类型与上下文相关。令人高兴的是,文档非常清楚地解释了这一点:
以&#39; YYYY-MM-DD HH:MM:SS&#39;中的值返回当前日期和时间。 或YYYYMMDDHHMMSS格式,具体取决于是否使用该功能 字符串或数字上下文。
当然,你必须弄清楚不同的背景是什么。一个提示。使用-
是一个&#34;数字上下文&#34;。
以下是发生的事情。 MySQL看到CURRENT_TIMESTAMP
并输入当前时间。但是怎么样?它看到-
并确定它作为数字进入。然后它遇到了last_start
。好吧,现在也必须将其转换为数字。你猜怎么着?你得到了时髦的行为。