AVG Время с миллисекундами в MySql - PullRequest
1 голос
/ 18 октября 2019

У меня проблема с временем AVG (мм: сс.ххх) с MySql. Мой код:

CREATE TABLE `tempFast` (
  `posicion` int(11) NOT NULL,
  `lapTime` time(3) NOT NULL,
  `id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



INSERT INTO `tempFast` (`posicion`, `lapTime`, `id`) VALUES
(1, '00:01:50.964', 1),
(1, '00:01:51.080', 2),
(1, '00:01:52.006', 3),
(1, '00:02:04.749', 4),
(1, '00:01:50.647', 5),
(1, '00:01:50.864', 6),
(1, '00:01:51.626', 7),
(1, '00:01:59.797', 8),
(2, '00:01:50.828', 20),
(2, '00:01:58.812', 21),
(2, '00:01:51.550', 22),
(2, '00:01:51.706', 23),
(2, '00:02:06.219', 24),
(2, '00:02:06.164', 25),
(2, '00:01:50.908', 26),
(2, '00:01:50.922', 27),
(2, '00:01:54.173', 28),
(2, '00:01:51.126', 29),
(2, '00:01:51.607', 30);

Тогда у меня будет средняя группа времени по положению. Это означает, что позиция 1 должна быть 01: 53,967 , а позиция 2 должна быть 01: 54,910.

Я пытаюсь получить следующий запрос:

SELECT
posicion,
count(*) as cantidad,
SEC_TO_TIME(AVG(TIME_TO_SEC(laptime))) AvgLapTime
FROM `tempFast`
group by posicion

Возвращает следующий плохой результат:

posicion    cantidad    AvgLapTime
1              8        00:01:53.3750
2              11       00:01:54.3636

Как я могу использовать Avg и получить хороший результат? Спасибо.

На https://www.db -fiddle.com / f / myTK8u1M72P5Z8NffDjPtV / 0 вы получили код для попытки


*** Uueerdo, наконец-тоВаши показания показывают мне способ справиться с этим. С SEC_TO_TIME ((AVG (TIME_TO_SEC (время круга)) * 1000000 + МИКРОСЕКОНД (время круга)) / 1000000)

1 Ответ

0 голосов
/ 19 октября 2019

Поскольку в MySQL нет функции «до миллисекунды», одним из вариантов является использование функции MICROSECOND () для получения дробных секунд и TIME_TO_SEC () для получения полных целых секунд времени, затем TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime) для полученияцелые микросекунды. Усредните это, затем разделите на 1000000, чтобы вернуться к секундам, и затем используйте SEC_TO_TIME(), чтобы вернуться к типу данных времени.

SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000000 + MICROSECOND(laptime)))/1000000)

, если время большое, выможет также учитывать это изменение, когда среднее значение фактически рассчитывается в миллисекундах:

SEC_TO_TIME((AVG(TIME_TO_SEC(laptime) * 1000 + MICROSECOND(laptime) / 1000))/1000)

...