Как работать с форматированием результатов спортивных гонок в SQL, желательно MariaDB - PullRequest
0 голосов
/ 01 апреля 2019

Время во многих видах спорта / соревнованиях обычно с точностью до 1/100th секунды, в некоторых даже до 1/1000th секунды.

Пара случайных примеров из плавания, в которых используется 1/100th секундная точность (в формате 'minutes:seconds,100th of second'):

50m Backstroke 00:34,12

1500m Freestyle 18:49,02

Разделителем после поля секунд может быть запятая или точка - и то, и другое видно в профессиональных системах учета времени.

Как достигается это форматирование в SQL / MariaDB и какой тип поля следует использовать? Я считаю, что при вводе данных необходимо использовать 1/1000 с точностью до секунды, но форматировать вывод в запросе 1/100th.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Вы, вероятно, должны использовать MySQL / MariaDB TIME.
См. Дробные секунды в значениях времени

Ваш приведенный выше пример может быть выполнен следующим образом (с result TIME(2)):

CREATE TABLE `swimming_race` (
    `swimmer_id` INT (10) unsigned NOT NULL
    ,`distance` SMALLINT (5) unsigned NOT NULL
    ,`style` VARCHAR(25) NOT NULL
    ,`result` TIME(2) NOT NULL
    );

INSERT INTO `swimming_race` (
    `swimmer_id`
    ,`distance`
    ,`style`
    ,`result`
    )
VALUES (
    '1'
    ,'50'
    ,'Backstroke'
    ,'0:00:34.12'
    )
    ,(
    '1'
    ,'1500'
    ,'Freestyle'
    ,'0:18:49.02'
    );

data in table after insert

0 голосов
/ 09 мая 2019

TIME(3) для хранения.

REPLACE(col, ',', '.') перед преобразованием в TIME(3), так что запятые будут превращаться в точки, а не сбивать преобразование.

mysql> SELECT CONVERT('0:1:23.456', TIME(3));
+--------------------------------+
| CONVERT('0:1:23.456', TIME(3)) |
+--------------------------------+
| 00:01:23.456                   |
+--------------------------------+

mysql> SELECT CONVERT('0:1:23,456', TIME(3));
+--------------------------------+
| CONVERT('0:1:23,456', TIME(3)) |
+--------------------------------+
| 00:01:23.000                   |   -- lost fraction because of comma
+--------------------------------+
1 row in set, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1292 | Truncated incorrect time value: '0:1:23,456' |
+---------+------+----------------------------------------------+

Завершенные примеры:

mysql> SELECT CONVERT(REPLACE('0:1:23,456', ',', '.'), TIME(3));
+---------------------------------------------------+
| CONVERT(REPLACE('0:1:23,456', ',', '.'), TIME(3)) |
+---------------------------------------------------+
| 00:01:23.456                                      |
+---------------------------------------------------+

mysql> SELECT CONVERT(REPLACE('0:1:23,456', ',', '.'), TIME(3)) with_comma;
+--------------+
| with_comma   |
+--------------+
| 00:01:23.456 |
+--------------+

mysql> SELECT CONVERT(REPLACE('0:1:23.456', ',', '.'), TIME(3)) with_dot;
+--------------+
| with_dot     |
+--------------+
| 00:01:23.456 |
+--------------+

mysql> SELECT CONVERT(REPLACE('0:1:23.45', ',', '.'), TIME(3)) with_2_digits;
+---------------+
| with_2_digits |
+---------------+
| 00:01:23.450  |
+---------------+
0 голосов
/ 01 апреля 2019

Спасибо за предложения.Форматирование с использованием datetime(2) - это один из вариантов, который будет работать, но часть даты не требуется.

MariaDB [(none)]> SELECT CONVERT('2019-04-01 00:03:19.3200000',datetime(2));
+----------------------------------------------------+
| CONVERT('2019-04-01 00:03:19.3200000',datetime(2)) |
+----------------------------------------------------+
| 2019-04-01 00:03:19.32                             |
+----------------------------------------------------+
1 row in set, 1 warning (0.005 sec)

Использование TIME(2) в качестве моего типа данных было на месте.

Из историиИнтерес только: когда это было реализовано в MariaDB / MySQL?Я смотрел на похожую проблему 5-6 лет назад, но тогда я не смог ее найти :)

Еще раз спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...