TIMESTAMPDIFF产生否定结果

时间:2017-09-14 07:29:09

标签: mysql sql

我遇到以下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)

有什么想法吗?

0 个答案:

没有答案