Мне нужно работать с базой данных postgres 9.4, и я хочу работать с меткой времени. Первая "проблема" заключается в том, что когда я создаю столбец timestamp в postgres, я не знаю, что он делает внутри, но когда я запрашиваю, он возвращает "2010-10-30 00:00:00",
Для меня временная метка похожа на это 12569537329 (временная метка unix).
Я говорю, что, поскольку это целое число или float, для компьютера проще сравнивать сравнение с строкой, и каждая страна имеет свой собственный формат времени, а временная метка unix - это число и конец истории.
Запрос из php - это строка, поэтому мне нужно сделать жонглирование сгустком, а из-за часового пояса, дневного света и других вещей что-то может пойти не так.
Я много искал и не могу найти способ работать с timestamp unix на postgresql.
Может кто-нибудь объяснить, есть ли способ или правильный способ работы и как можно ближе подойти к отметке времени unix.
ОБНОВИТЬ
Одна вещь, которую я обнаружил, что она мне поможет, и это займет много времени, чтобы обнаружить, что это возможно на postgresql - это изменение выходного интервала.
В php интервал дат для месяца - месяц, поскольку pg является "mon" на php, он будет понимать mon как понедельник. Я думаю, что если вам приходится слишком много жонглировать, вы делаете это неправильно. Приятно postgres позволяют нам изменить это поведение для сеанса или постоянно. Таким образом, установив intervalstyle
в iso_8601
он будет работать как php iso_8601 и будет выводить P1M
Просто конвертируйте 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)
Если вы просто запросите столбец timestamp в postgres, вы получите отформатированную дату. Если вы предпочитаете целое число timestamp unix, вы можете либо бросить его, когда вы вернете его, используя синтаксис, например
select extract(epoch from '2011-11-15 00:00:00+01'::timestamp with time zone)::integer;
Если вы сделаете это много, вы можете сделать вид с выпиской.
или вы можете определить свой столбец timestamp как целое число и сохранить свои данные с помощью функции extract()
gettime()
Unix для своихtimestamp
и имеет отличную поддержку для часовых поясов и летнего времени. Уточните свой вопрос с помощью примеров, и вы получите ответ.