как да работите с unix timestamp на postgresql

Трябва да работя с база данни на postgres 9.4 и искам да работя с клеймо за време. Първият „проблем“ е, че когато създам колона с клеймо за време в postgres, не знам какво прави вътрешно, но когато направя заявка, тя връща „2010-10-30 00:00:00“

За мен времево клеймо е нещо като това 12569537329 (unix времево клеймо).

Казвам това, тъй като е цяло число или плаваща единица, за компютъра е много по-лесно да се справя в сравнение с низ и всяка страна има свой собствен формат на времето, като unix timestamp е число и край на историята.

При заявка от php резултатът е низ, така че трябва да направя куп жонглиране и поради часовата зона, лятното часово време и други неща може нещо да се обърка.

Търсих много и не мога да намеря начин да работя с unix timestamp на postgresql.

Може ли някой да обясни дали има начин или правилният начин да работите и да се доближите възможно най-близо до времевия печат на unix.

АКТУАЛИЗАЦИЯ

Едно нещо, което открих, че ще ми помогне и отне много време, за да открия, че е възможно на postgresql, е промяната на Интервалния изход.

pg ръководство

В php интервалът от дати за месеца е 'month' за pg е 'mon' на php той ще разбере mon като понеделник. Мисля, че ако трябва да жонглираш твърде много, го правиш погрешно. С удоволствие postgres ни позволява да променим това поведение за сесия или за постоянно. Така че настройването на intervalstyle на iso_8601 ще работи като php iso_8601 и ще изведе P1M


person Mateus Silva    schedule 20.01.2016    source източник
comment
Моля, покажете какво точно правите, за да получите резултата, който показвате. PG всъщност използва функцията Unix gettime() за своите timestamps и има отлична поддръжка за часови зони и DST. Конкретизирайте въпроса си с примери и ще получите отговор.   -  person Patrick    schedule 20.01.2016
comment
Точно сега това не е конкретен въпрос, това са много неща, които срещнах. едно нещо, което имам прясно в паметта си, е това. Имам дата в моя db, 2015/08/31 23:00:00, но само с това не знам дали вече е преобразувана с часовата зона или някой е объркал кода и е запазил с грешната часова зона. timestamp е абсолютен, с тази информация в ръка предавам часовата зона на php функция и знам точно как да боравя с информацията. Хората обикновено харесват този формат „2015/08/31 23:00:00“, защото мога да гледам и разбирам, но съм по-загрижен да имам надеждна информация.   -  person Mateus Silva    schedule 20.01.2016
comment
PG има двата типа данни timestamp и timestamp with time zone. Секундата винаги се съхранява в UTC и може да се показва във всяка часова зона, която желаете, местното време ще бъде правилно. Първият е в същата часова зона като сървъра. Проблемът, който описвате, е по-скоро управление на данни на потребителско ниво, а не свързан с DB.   -  person Patrick    schedule 20.01.2016
comment
@Patrick да, опитвам се да поправя бъркотия, която друг разработчик направи, и се опитвам да предотвратя в бъдеще.   -  person Mateus Silva    schedule 21.01.2016


Отговори (2)


Просто преобразувайте 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)
person wildplasser    schedule 20.01.2016
comment
Не искам точно, но ще работи, не съм запознат с postgres, волята ми е да запазя времевия печат на php като цяло число в db, но сега разбирам, че това не е най-добрата практика. - person Mateus Silva; 21.01.2016
comment
Предимството на реалния тип дата/час е, че манипулациите върху него са относително лесни. Добавяне на няколко дни, установяване дали дадено времево клеймо е в рамките на определен месец или година и т.н. И всичко това включва корекция на високосни дни и високосни секунди (и часови зони). И вход/изход (когато е необходимо) е възможен; виж отговора ми. - person wildplasser; 22.01.2016

Ако просто направите заявка за колона с клеймо за време в postgres, ще получите форматирана дата. Ако предпочитате unix timestamp integer, можете или да го преобразувате, когато го върнете, като използвате синтаксис като

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

Ако правите това често, можете да направите изглед с екстракта.

или можете да дефинирате колоната си с клеймо като цяло число и да съхранявате данните си с помощта на extract()

person MortenSickel    schedule 20.01.2016
comment
Виждах това често при търсене в Google, но когато се опитах да използвам с колона, винаги получавам грешка - person Mateus Silva; 21.01.2016