Подтвердить что ты не робот

Тип поля PostgreSQL для отметки времени unix?

Тип поля PostgreSQL для отметки времени unix:

  • чтобы сохранить его как временную метку unix.
  • чтобы получить его как временную метку unix.

Проходили Типы даты и времени postgreSQL V 9.1.


  • Целое - лучший способ!? (это то, что я сделал, когда использовал MySQL. Использовал int(10))
4b9b3361

Ответ 1

integer будет хорошим, но недостаточно хорошим, потому что postgresql не поддерживает unsigned типы

Ответ 2

Временная метка unix epoch прямо сейчас (2014-04-09) - 1397071518. Поэтому нам нужен тип данных, способный хранить число, по крайней мере, такое большое.

Какие типы данных доступны?

Если вы ссылаетесь на документацию PostgreSQL на числовые типы, вы найдете следующие варианты:

Name      Size     Minimum               Maximum
smallint  2 bytes  -32768                +32767
integer   4 bytes  -2147483648           +2147483647
bigint    8 bytes  -9223372036854775808  +9223372036854775807

Что это означает в отношении представления времени?

Теперь мы можем взять эти числа и преобразовать их в даты с помощью epoch converter:

Name      Size     Minimum Date      Maximum Date
smallint  2 bytes  1969-12-31        1970-01-01
integer   4 bytes  1901-12-13        2038-01-18
bigint    8 bytes  -292275055-05-16  292278994-08-17

Обратите внимание, что в последнем случае использование секунд ставит вас так далеко в прошлое и будущее, что это, вероятно, не имеет значения. Результат, который я дал, - это если вы представляете эпоху unix в миллисекундах.

Итак, что мы узнали?

  • smallint явно плохой выбор.
  • integer - достойный выбор на данный момент, но ваше программное обеспечение взорвется в 2038 году. Апокалипсис Y2K не имеет ничего в проблеме 2038 года.
  • Использование bigint - лучший выбор. Это надежное будущее для большинства мыслимых человеческих потребностей, хотя Доктор может по-прежнему критиковать его.

Вы можете или не можете подумать, не лучше ли хранить временную метку в другом формате, таком как стандарт ISO 8601.

Ответ 3

Я бы просто использовал TIMESTAMP WITH (OUT) TIME ZONE и использовал EXTRACT, чтобы получить представление временной метки UNIX, когда вам это нужно.

Сравнить

SELECT NOW();

с

SELECT EXTRACT(EPOCH FROM NOW());

Ответ 4

Я не понимаю, почему у этого вопроса есть отрицательные голоса.

В любом случае, я нашел близкий вопрос на сайте Администраторы баз данных (со многими положительными голосами).

Это просто предложить посмотреть, потому что есть гораздо более полная информация об этой нетривиальной теме.