Як найкраще зберігати мітку часу в PostgreSQL?


20

Я працюю над дизайном DB PostgreSQL і мені цікаво, як краще зберігати часові позначки.

Припущення

Користувачі в різних часових поясах використовуватимуть базу даних для всіх функцій CRUD.

Я переглянув 2 варіанти:

  • timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')

  • bigint NOT NULL DEFAULT

Бо timestampя б надіслав рядок, який би представляв точну (UTC) часову позначку для моменту ВСТАВКИ.

Бо bigintя б зберігав абсолютно те саме, але у форматі чисел. (Проблеми з часовим поясом обробляються перед передачею на сервер мільйонів, тому завжди розміщуйте мільйони в UTC.)

Однією з головних переваг зберігання файлу bigintможе бути те, що його буде простіше зберігати та витягувати, оскільки передача правильно відформатованої часової позначки є складнішою за просте число (міліс з моменту Unix Epoc).

Моє запитання - який з них дозволить отримати найбільш гнучку конструкцію і які можуть бути підводні камені кожного підходу.


Є багато причин, чому часова марка краща за біґінт для представлення часових позначок. Я не можу придумати жодної причини, чому бигтінг був би кращим, ніж часова мітка.
Леннарт

Основна причина, на яку я думаю, що BigInt може бути простішим, це те, що його можна буде набагато легше знайти та зберігати. Я оновлю свої запитання.
Бам

Відповіді:


23

Зберігайте часові позначки як timestamp, а точніше timestamptz( timestamp with time zone), оскільки ви маєте справу з кількома часовими поясами . Це застосовує дійсні дані і, як правило, є найбільш ефективними. Не забудьте зрозуміти тип даних, навколо нього випливають деякі помилки:

Щоб вирішити вашу проблему:

передача правильно відформатованої позначки часу є складнішою за просте число

Ви можете передавати та отримувати епоху UNIX будь-яким способом:

SELECT to_timestamp(1437346800)
     , extract(epoch FROM timestamptz '2015-07-20 01:00+02');

Пов'язані:

Якщо ви хочете зберегти поточну позначку часу з записом у БД, використовуйте timestamptz стовпець зі значенням за замовчуваннямnow() . Системний час на сервері БД, як правило, набагато надійніший і послідовніший, ніж численні клієнти передають у відповідне уявлення про те, який саме час.
Бо INSERTвін може бути таким же простим, як:

CREATE TABLE foo (
  ... -- other columns
, created_at timestamptz NOT NULL DEFAULT now()
);

І просто не пишіть у цю колонку. Він заповнюється автоматично.


Це зрозуміло. На додаток до того, що часові позначки зберігаються як 8-байтні цілі числа, важливі так само, як зберігання як bigint, зберігання та відновлення функцій "to_timestamp", робить це набагато простішим вибором. Дякую
Бам

8

Ви завжди повинні зберігати дані у власному типі даних, щоб ви могли використовувати вбудовані функції. І тип даних часової позначки, очевидно, є timestamp.

До речі, timestampце НЕ зберігається у вигляді рядка, вона зберігається як 8-байтове ціле число, точно так же , як bigint: PostgreSQL документації .


Вибачте, я хотів сказати, що надсилаю рядок на зберігання, а не зберігати часову позначку. Виправили це.
Бам
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.