我遇到以下TIMESTAMPDIFF(计算位置变化之间的时间差)产生否定结果的问题,但仅针对第一次TIMESTAMPDIFF计算,此后每个后续行的计算是正确的,可能是IFNULL表达式不正确 -
SELECT
assetID
, nodeid
, @changed := IF(nodeid <> previousLocationID, @changed + 1, @changed) AS changed
, IFNULL(TIMESTAMPDIFF(SECOND, previousTs, ts), 0) AS secDiff
FROM
(SELECT
assetID
, nodeid
, @locationID AS previousLocationID
, @locationID := nodeid AS currentLocationID
, ts
, @ts AS previousTs
, @ts := ts AS currentTs
FROM Logs L1
where assetID LIKE varassetid
and ts >= vardtmin
and ts <= vardtmax
ORDER BY ts
) L2
输出(由内部SELECT产生并简化为显示位置/ nodeid的变化)是正确的 -
assetID nodeid previousLocationID currentLocationID ts previousTs currentTs
1569 1 NULL 1 2017-09-04 09:33 NULL ...
1569 1 NULL 1 2017-09-04 09:40 NULL ...
1569 2 NULL 2 2017-09-04 09:40 NULL ...
1569 2 NULL 2 2017-09-04 09:41 NULL ...
1569 1 NULL 1 2017-09-04 09:41 NULL ...
外部SELECT产生的输出是 -
assetID nodeid changed secDiff
1569 1 NULL -2676
1569 1 NULL 1
1569 1 NULL 1
1569 1 NULL 3
第一个secDiff是负/不正确(它应该是392秒(6分钟和32秒))。
我认为此声明无法正常工作(仅适用于第一次计算)或其中一个变量以未知状态启动 -
, IFNULL(TIMESTAMPDIFF(SECOND, previousTs, ts), 0) AS secDiff
更改为 -
IF(timestampdiff(second, previousTs, ts) < 0, 0, timestampdiff(second, previousTs, ts)) as secDiff
消除负值,但结果为零(而不是392秒)
我怀疑其中一个变量是在一个仲裁状态下开始的,这会导致第一行计算的问题(这里没有以前的TS)
有什么想法吗?