如何计算两个时间戳之间的差异,然后逐个月地在SQL中进行图表绘制

问题描述 投票:0回答:3

我正在尝试根据具有日期/时间戳和各种其他varchar和int字段的记录来形成满足以下条件的SQL语句。

  • 以十进制小时计算名为time_departtime_return的两个字段之间的差异
  • 在过去的12个月中总计差异和逐个月。
  • 基于event_type的单独总计

示例数据集

events

id | time_depart         | time_return         | event_type  | summary
--------------------------------------------------------------
1  | 2019-02-11 10:00:00 | 2019-02-11 10:30:00 | 1           | test summary
2  | 2019-02-11 10:30:00 | 2019-02-11 11:30:00 | 1           | some more data
3  | 2019-02-11 11:00:00 | 2019-02-11 12:30:00 | 2           | even more data
4  | 2019-02-11 11:30:00 | 2019-02-11 13:30:00 | 2           | just a summary
5  | 2019-02-11 12:00:00 | 2019-02-11 14:30:00 | 2           | again more
......

想回报类似于event_type = 1'training'event_type = 2'mission'

month     | trainingTime | missionTime  
--------------------------------------------------------------
january   | 15.25        | 22 
february  | 20           | 25
march     | 10.5         | 35.5
april     | 52           | 20 
may       | 64           | 72 
june      | 100          | 10.75 
july      | 45           | 0 
august    | 26           | 15
september | 10.5         | 65
october   | 55           | 8
november  | 44           | 12.25 
december  | 17           | 0
php mysql sql
3个回答
0
投票

典型的解决方案是使用条件聚合。按月分组数据,然后分别计算每种事件类型的总和。

目前还不清楚您希望以何种格式表达持续时间。以下查询将以秒为单位返回持续时间(然后您可以在应用程序层或使用MySQL日期和时间函数格式化它们)。

查询:

SELECT 
    DATE_FORMAT(time_depart, '%Y-%M') eventMonth,
    SUM(
        CASE WHEN event_type = 1 
        THEN TIMESTAMPDIFF(SECOND, time_depart, time_return)
        ELSE 0 
    END) trainingTime,
    SUM(
        CASE WHEN event_type = 2 
        THEN TIMESTAMPDIFF(SECOND, time_depart, time_return)
        ELSE 0 
    END) missionTime
FROM events
GROUP BY DATE_FORMAT(time_depart, '%Y-%M')
ORDER BY eventMonth

注意:如果您的数据传播超过12个月,将年份作为分组条件也是一个好主意。

Demo on DB Fiddle包含您的样本数据:

| eventMonth    | trainingTime | missionTime |
| ------------- | ------------ | ----------- |
| 2019-February | 5400         | 21600       |

0
投票

我刚刚在另一个链接上搜索了这个:

SELECT TIMESTAMPDIFF(MONTH, time_depart, time_return) as difference;

我希望这有助于......链接:The difference in months between dates in MySQL


0
投票

很容易。

SELECT
MONTH(time_return) as month,
SUM(TIMESTAMPDIFF(SECOND, time_depart, time_return)) as sum_diff_in_seconds,
TIME_FORMAT(SUM(SEC_TO_TIME(TIMESTAMPDIFF(SECOND, time_depart, time_return))), '%H:%s:%s') as sum_time
FROM
<your table>
GROUP BY MONTH(time_return)

您可以根据需要修改组。

TIME_FORMAT存在一个问题,它只允许格式化为'838:59:59',这是TIME数据类型可以具有的最大值。

秒数应准确......

最后一件事:你可能会有“边缘”值,其中离开和返回的时间不是同一个月......它们根据“分组”计算到离开月份或返回月份。

第二次编辑:您修改了帖子并添加了第三个要求..将其添加到GROUP BY之类

GROUP BY MONTH(..), type

HTH

© www.soinside.com 2019 - 2024. All rights reserved.