как работать с меткой времени unix на postgresql

1

Мне нужно работать с базой данных postgres 9.4, и я хочу работать с меткой времени. Первая "проблема" заключается в том, что когда я создаю столбец timestamp в postgres, я не знаю, что он делает внутри, но когда я запрашиваю, он возвращает "2010-10-30 00:00:00",

Для меня временная метка похожа на это 12569537329 (временная метка unix).

Я говорю, что, поскольку это целое число или float, для компьютера проще сравнивать сравнение с строкой, и каждая страна имеет свой собственный формат времени, а временная метка unix - это число и конец истории.

Запрос из php - это строка, поэтому мне нужно сделать жонглирование сгустком, а из-за часового пояса, дневного света и других вещей что-то может пойти не так.

Я много искал и не могу найти способ работать с timestamp unix на postgresql.

Может кто-нибудь объяснить, есть ли способ или правильный способ работы и как можно ближе подойти к отметке времени unix.

ОБНОВИТЬ

Одна вещь, которую я обнаружил, что она мне поможет, и это займет много времени, чтобы обнаружить, что это возможно на postgresql - это изменение выходного интервала.

руководство пользователя pg

В php интервал дат для месяца - месяц, поскольку pg является "mon" на php, он будет понимать mon как понедельник. Я думаю, что если вам приходится слишком много жонглировать, вы делаете это неправильно. Приятно postgres позволяют нам изменить это поведение для сеанса или постоянно. Таким образом, установив intervalstyle в iso_8601 он будет работать как php iso_8601 и будет выводить P1M

  • 1
    Пожалуйста, покажите, что вы делаете, чтобы получить результат, который вы показываете. PG фактически использует gettime() Unix для своих timestamp и имеет отличную поддержку для часовых поясов и летнего времени. Уточните свой вопрос с помощью примеров, и вы получите ответ.
  • 0
    Прямо сейчас это не конкретный вопрос, это много вещей, с которыми я столкнулся. одна вещь, которая у меня свежа в моей памяти, это. У меня есть дата в моей базе данных, 2015/08/31, 23:00:00, но только из-за того, что я не знаю, преобразован ли уже с часовым поясом, или кто-то испортил код и сохранил с неправильным часовым поясом. временная метка является абсолютной, с этой информацией я передаю часовой пояс функции php и точно знаю, как с ней обращаться. Людям нравится этот формат «2015/08/31 23:00:00», потому что «я могу смотреть и понимать», но меня больше беспокоит наличие надежной информации.
Показать ещё 2 комментария
Теги:
unix-timestamp

2 ответа

0
Лучший ответ

Просто конвертируйте unix time_t в/из метки времени и используйте это в postgres:

CREATE TABLE omg
        ( seq SERIAL NOT NULL PRIMARY KEY
        , stampthing TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
        );

INSERT INTO omg(stampthing) SELECT now();

INSERT INTO omg(stampthing) VALUES
 ('epoch'::timestamptz )
 , ('epoch'::timestamptz + 12569537329 * '1 second'::interval)
        ;

SELECT stampthing
        , DATE_PART('epoch',stampthing) AS original
FROM omg;

Вывод:

CREATE TABLE
INSERT 0 1
INSERT 0 2
          stampthing           |     original     
-------------------------------+------------------
 2016-01-20 16:08:12.646172+01 | 1453302492.64617
 1970-01-01 01:00:00+01        |                0
 2368-04-24 20:08:49+02        |      12569537329
(3 rows)
  • 0
    Это не совсем то, что я хочу, но это сработает, я не знаком с postgres, моя воля - сохранить временную метку php как целое число на БД, но я теперь, когда это не лучшая практика.
  • 0
    Преимущество реального типа даты / времени в том, что манипуляции с ним относительно просты. Добавление нескольких дней, определение того, находится ли временная метка в определенном месяце или году и т. Д. И все это, включая високосные дни коррекции и дополнительные секунды (и часовые пояса). И ввод / вывод (при необходимости) возможен; смотри мой ответ.
0

Если вы просто запросите столбец timestamp в postgres, вы получите отформатированную дату. Если вы предпочитаете целое число timestamp unix, вы можете либо бросить его, когда вы вернете его, используя синтаксис, например

select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;

Если вы сделаете это много, вы можете сделать вид с выпиской.

или вы можете определить свой столбец timestamp как целое число и сохранить свои данные с помощью функции extract()

  • 0
    Я часто видел это в поиске в Google, но когда я пытался использовать столбец, я всегда получаю сообщение об ошибке.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню