Лучший способ сохранить время выше 24:00:00 в postgresql?

Я храню каналы GTFS в базе данных SQL, и в некоторых случаях ожидается, что они будут храниться выше предела 24:00:00 по временным значениям. Например, некоторые поезда отправляются в 00:30, но указаны для обслуживания в предыдущие дни, и это время движения сохраняется как 24:30 в спецификациях GTFS.

Что было бы лучшим способом обойти это? Должен ли я просто сохранить его как строку?


person Jimmy Gong    schedule 08.09.2015    source источник
comment
Есть ли естественная отсечка, т.е. как 3 часа ночи? Каковы причины этого причудливого способа вместо того, чтобы просто возвращать предыдущий день для компонента времени до этого отсечки в 3 часа ночи?   -  person mlt    schedule 08.09.2015
comment
Не совсем уверен, но они просто предпочитают смешивать ночные пробежки с предыдущим днем. Точка отсечки — интересная идея, гипотетически я мог бы просто установить время отсечки как 00:00:00, поскольку это все равно будет 24-часовой цикл. Борьба с этим заключается в том, что разные транспортные агентства могут иметь разное время отсечки, но я мог бы просто сохранить время отсечки в отдельном столбце, чтобы отслеживать, что означает 00:00:00.   -  person Jimmy Gong    schedule 08.09.2015
comment
Это интересно, потому что вы действительно сохраняете время, а не интервал. Обычно, когда люди спрашивают об этом, они хотят сохранить количество часов, а не фактическое время. Один из вариантов — нормализовать время, перенеся услугу на следующий день и вычтя 24 часа из времени. Вы могли бы (ab)использовать interval, но это немного уродливо. В этом случае может иметь смысл вернуться к целочисленным секундам.   -  person Craig Ringer    schedule 09.09.2015


Ответы (2)


Предложите использовать int для этого... ваше значение может быть:

Sec + Min * 60 + Hour * 3600

За 24:30:00 вы получите 88200.

При загрузке вашего значения из БД вы можете изменить свое значение с помощью простого математического уравнения:

Hour = int(value / 3600)
Min  = int(value % 3600 / 60)
Sec  = value % 3600 % 1800
person EH Ong    schedule 08.09.2015
comment
Это значительно упрощает ряд вычислений (например, вычисление времени ожидания), и я считаю, что это лучший подход. Кроме того, обратите внимание, что время, указанное в GTFS, не является настоящим временем настенных часов, а скорее смещается с полудня минус 12 часов, что в этом числовом представлении становится немного более явным. - person ; 09.09.2015

Я бы сохранил два поля:

departure_time timestamp with time zone,
service_date date

Время отправления будет рассчитываться так:

 => select '2015-07-08'::timestamptz+'24:30'::interval;
 2015-07-09 00:30:00+02

Сюда:

  • у вас есть обычное поле момент времени для сортировки событий;
  • вы не потеряете информацию о дате обслуживания;
  • при необходимости вы сможете рассчитать исходные данные GTFS.
person Tometzky    schedule 08.09.2015