我正在尝试根据具有日期/时间戳和各种其他varchar和int字段的记录来形成满足以下条件的SQL语句。
time_depart
和time_return
的两个字段之间的差异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
典型的解决方案是使用条件聚合。按月分组数据,然后分别计算每种事件类型的总和。
目前还不清楚您希望以何种格式表达持续时间。以下查询将以秒为单位返回持续时间(然后您可以在应用程序层或使用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 |
我刚刚在另一个链接上搜索了这个:
SELECT TIMESTAMPDIFF(MONTH, time_depart, time_return) as difference;
我希望这有助于......链接:The difference in months between dates in MySQL
很容易。
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