Хранилище длительности Postgres

#php #sql #postgresql

#php #sql #postgresql

Вопрос:

Я хотел бы сохранить продолжительность в базе данных, в моем случае это продолжительность тренировки (спорт). Мы устанавливаем, когда мы проводим обучение (дата и время) и как долго длится сеанс (продолжительность).

На данный момент я выбрал Time тип, затем у меня есть: 01:00:00 в течение часа обучения и извлекаю объект Datetime в PHP (но я думаю, что не идеально суммировать их для примера), и в моей форме у меня нежелательное поведение: тип времени htmlавтоматически устанавливает текущий час, когда время пусто.

Я сомневаюсь в:

  • сохраняйте время, кажется логичным / простым иметь что-то вроде: 00:00:00
  • сохраните его как секунды или минуты в виде целого числа, возможно, проще сделать сумму суммы обучения для примера (необходимо создать конвертер, чтобы отобразить его как 00:00 или 00: 00:00, и найти хороший способ заполнить его в форме)
  • способ, о котором я не думал?

Большое спасибо за вашу помощь.

Комментарии:

1. Звучит как ИНТЕРВАЛ, стандартный тип данных в PostgreSQL. Презентация — это то, что должно быть сделано imho в графическом интерфейсе, а не в базе данных. postgresql.org/docs/current /…

Ответ №1:

Правильный тип данных для хранения длительности — interval .

Это упрощает выполнение арифметики даты: вы можете просто добавить длительность ко времени начала, чтобы получить время окончания:

 SELECT INTERVAL '01:30:00';

 interval 
----------
 01:30:00
(1 row)

SELECT TIME '09:00:00'   INTERVAL '01:30:00';

 ?column? 
----------
 10:30:00
(1 row)

SELECT TIMESTAMP WITH TIME ZONE '2021-03-28 02:00:00 01'   INTERVAL '01:30:00';

        ?column?        
------------------------
 2021-03-28 04:30:00 02
(1 row)
 

Комментарии:

1. Большое спасибо, я не знал этого типа.

Ответ №2:

Я не уверен, в чем заключается ваш вопрос. У Postgres нет проблем с использованием sum() time типа данных:

 select sum(t)
from (values ('03:12:00'::time), ('05:27:00'), ('18:59')) v(t)
 

Вы также можете использовать interval .

У вас могут возникнуть проблемы, если отдельные длительности превышают 24 часа. Если это потенциальная проблема, просто используйте часы, минуты или секунды.

Если у вас есть проблема с «пустыми» значениями, вам нужно будет установить их явно. Это звучит как ошибка на стороне HTML.

Комментарии:

1. Почему time и нет interval ?

2. @LaurenzAlbe . . . . Дух. Это тоже имеет смысл. На самом деле больше смысла — за исключением того, что значения, превышающие 24 часа, также начинают включать дни.

3. Спасибо за информацию о сумме времени. Поскольку я не знал тип интервала, я и не думал его использовать. Но, похоже, это лучший способ сделать. Еще раз спасибо за вашу помощь.