Хранение продолжительности в MySQL - PullRequest
0 голосов
/ 27 декабря 2018

Мне нужно хранить длительности, такие как следующие в mysql:

- 30 seconds
- 20 minutes, 12 seconds
- 1 month

Каков наилучший способ сохранить это, поскольку определение месяца не может быть уменьшено, например, доколичество секунд.Моей первой мыслью было хранить каждый инкремент отдельно, например:

- num_seconds
- num_minutes
- num_hours
- num_days
- num_months

. Это может хранить вышеприведенное, но я надеялся, что есть более прямой и менее подробный способ сделать это.

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Сохраняйте интервалы от года до месяца как целое число, считая количество месяцев (12 месяцев = 1 год), а интервалы от дня до секунды - целое число секунд.

Затем можно использоватьDATE_ADD функция, чтобы выяснить ваши даты.Вот пример SQL Fiddle , показывающий интервалы хранения в виде месяцев и секунд и добавление их к фиксированной дате:

Настройка схемы MySQL 5.6 :

create table mytab (dt date);
insert into mytab values (date '2018-01-01');

create table intervals (months int, seconds int);
insert into intervals values (13, 3661), (-13, -3661);

Запрос 1 :

select dt
     , months
     , seconds
     , date_add(date_add(dt, interval months month)
                           , interval seconds second) result
  from mytab cross join intervals

Результаты :

|         dt | months | seconds |               result |
|------------|--------|---------|----------------------|
| 2018-01-01 |     13 |    3661 | 2019-02-01T01:01:01Z |
| 2018-01-01 |    -13 |   -3661 | 2016-11-30T22:58:59Z |
0 голосов
/ 27 декабря 2018

Моим первым вариантом будет сохранение длительности в виде количества секунд с типом данных INT.Это сделает вычисления и операции сравнения быстрыми и чистыми.Также вы можете легко вычислить продолжительность между двумя значениями datetime, вычтя их метку времени Unix.Когда вам нужно отобразить значения, вы можете использовать функцию mysql sec_to_time :

Однако, если вы хотите манипулировать большими периодами (месяцами, годами), это не будет работать.В этом случае я бы откатился на столбец VARCHAR с продолжительностью iso8601 , например, P3Y6M4DT12H30M5S, на 3 года, 6 месяцев, 4 дня, 12 часов, 30 минут и 5 секунд.Это хорошо известный формат, который поддерживается многими приложениями (но с ним будет труднее работать).

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