我有一個持續的過程,它檢查數據庫表中的一行,並根據子進程最後一次產生的時間(基本上,一個非常簡單的CRON替換)在某個時間間隔產生子進程。減去時間戳差異
我最初實現它,只是從存儲在last_start列中的值中減去當前時間戳。 CURRENT_TIMESTAMP - last_start
。這似乎工作,但更仔細的檢查顯示時間戳扣除行爲相當奇怪。
看起來,當我們越過分鐘屏障(所以,當前時間點到一分鐘),計算出的「差異」將跳躍40(例如從59增加到100)。這個看起來像像「1:00」 - 類型 - 直到我們達到如下所示的狀態,其中「秒」部分超過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
'last_start'的數據類型是什麼?處理未存儲在本機類型中的日期和時間時,MySQL可能會很時髦。 – 2014-09-18 20:00:49
添加了create table語句 – v4nz 2014-09-18 20:11:29
使用'timestampdiff()'而不是'-'。 '-'將參數視爲整數,這會導致您的問題。 – 2014-09-18 20:12:54