mysql 当时间范围跨越一天时,查找事件的平均时间

cunj1qz1  于 2023-02-11  发布在  Mysql
关注(0)|答案(1)|浏览(169)

我试图确定一天中某个特定事件发生的平均时间。对于大多数事件,我可以使用以下查询来完成此操作:
SEC_TO_TIME( round( avg( TIME_TO_SEC( TIME(MY_EVENT_TIME) ) ) ),0 )
当时间范围跨越午夜时,这种逻辑就失效了。
给定以下数据集,21:37:37 22:00:29 23:01:13 23:09:41 23:56:37 00:02:43 00:15:31 01:19:52 02:55:59 04:27:56
我预计平均时间在00:00:00左右。
取UNIX_TIMESTAMP的平均值没有什么帮助,因为它考虑了日期。
有没有一个纯粹的MySQL方法来解决这个问题?

kwvwclae

kwvwclae1#

你的问题是,没有日期,所有的事件都发生在同一天,因此你最终得到的平均值是中午,而不是午夜。
向数据中添加日期可获得正确的结果。

create table day_event_log
(
    an_event timestamp not null
);

insert day_event_log(an_event)
values ('2023-01-01 21:37:37'),
       ('2023-01-01 22:00:29'),
       ('2023-01-01 23:01:13'),
       ('2023-01-01 23:09:41'),
       ('2023-01-01 23:56:37'),
       ('2023-01-02 00:02:43'),
       ('2023-01-02 00:15:31'),
       ('2023-01-02 01:19:52'),
       ('2023-01-02 02:55:59'),
       ('2023-01-02 04:27:56');

select time(FROM_UNIXTIME(AVG(UNIX_TIMESTAMP(an_event)))) avg_event
from day_event_log;

avg_event = 00:16:45.8000
虽然这解释了为什么你看到的数据集是中午的结果,但正如评论中提到的,它并没有解决你的问题。时间是连续的,所以你必须决定如何划分它,以及该时间段的“中心”在哪里,以便计算平均值。

相关问题