计算多个时间戳之间的差异总和

时间:2017-09-04 14:01:25

标签: mysql

我有一个表格,其中列出了list(zip(index3, fcs_dates))[:5] [(Timestamp('2016-01-01 00:00:00', freq='MS'), Timestamp('2016-02-01 00:00:00', freq='MS')), (Timestamp('2016-01-01 00:00:00', freq='MS'), Timestamp('2016-03-01 00:00:00', freq='MS')), (Timestamp('2016-01-01 00:00:00', freq='MS'), Timestamp('2016-04-01 00:00:00', freq='MS')), (Timestamp('2016-02-01 00:00:00', freq='MS'), Timestamp('2016-03-01 00:00:00', freq='MS')), (Timestamp('2016-02-01 00:00:00', freq='MS'), Timestamp('2016-04-01 00:00:00', freq='MS'))] 以及playerIDstartDate列。这些是时间戳。

e.g。

endDate

我正在尝试运行查询以获取特定玩家的playerID startDate endDate 1 2017-06-01 12:00:00 2017-06-01 12:05:00 1 2017-06-01 13:30:00 2017-06-01 13:33:00 1 2017-08-04 14:57:00 0000-00-00 00:00:00 startDate之间的总秒数。如果endDateendDate,那么我应该使用当前时间。

以下是我的尝试:

0000-00-00 00:00:00

这有两个问题。我不认为我可以使用select IF(endDate = '0000-00-00 00:00:00', CURRENT_TIMESTAMP, endDate) as finishDate, sum((startDate-finishDate)) as timeTaken from table where playerID=1 group by playerID ,因为我收到了一个未知的列错误。我还想要所有行的总和为playerID 1

1 个答案:

答案 0 :(得分:2)

MySQL有一个方便的函数TIMESTAMPDIFF,它可以计算各种单位的两个时间戳之间的差异,包括秒。我们可以简单地在每个玩家上进行聚合,并使用CASE表达式对起始和结束时间戳的差异进行求和,将当前时间戳的(有点奇怪的)零时间戳替换。

SELECT
    playerID,
    SUM(TIMESTAMPDIFF(SECOND,
                      startDate,
                      CASE WHEN endDate = '0000-00-00 00:00:00'
                           THEN CURRENT_TIMESTAMP ELSE endDate END)) AS timeTaken
FROM yourTable
GROUP BY playerID

编辑:我不知道0000-00-00 00:00:00在你的牌桌上做了什么,但我宁愿用NULL之类的东西来表示一个未知的结束时间戳。这也会使代码更好一点,例如我们可以使用以下内容来检查未知的结束时间戳:

COALESCE(endDate, CURRENT_TIMESTAMP)