PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Können Sie in Postgres die Standardformatierung für einen Zeitstempel nach Sitzung oder global festlegen?

In PostgreSQL ist die Formatierung von Zeitstempeln unabhängig von der Speicherung. Eine Antwort ist die Verwendung von to_char und formatieren Sie den Zeitstempel in dem Format, das Sie im Moment benötigen, wie hier:

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

Aber wenn Sie die Standardformatierung festlegen müssen:

Ändern Sie das postgresql-Zeitstempelformat global:

Sehen Sie sich Ihre Zeitzone an, führen Sie dies als SQL-Abfrage aus:

show timezone
Result: "US/Eastern"

Wenn Sie also current_timestamp ausdrucken, sehen Sie Folgendes:

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

Der -04 am Ende ist Ihre Zeitzone relativ zu UTC. Sie können Ihre Zeitzone ändern mit:

set timezone = 'US/Pacific'

Dann:

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07

Beachten Sie also den -07 dort bedeutet das, dass wir Pacific 7 Stunden von UTC entfernt sind. Wie kann ich diese unansehnliche Zeitzone verschwinden lassen? Eine Möglichkeit besteht darin, einfach eine Tabelle zu erstellen, die standardmäßig einen Zeitstempel ohne Zeitzone verwendet:

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

Wenn Sie dieser Tabelle dann einen Zeitstempel hinzufügen und daraus auswählen

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

yay, keine Zeitzone am Ende. Aber Sie möchten mehr Kontrolle darüber, wie der Zeitstempel standardmäßig angezeigt wird! Sie könnten etwa so vorgehen:

CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

Es ist ein Textfeld, das Ihnen mehr Kontrolle darüber gibt, wie es standardmäßig angezeigt wird, wenn Sie select somecolumns from sometable ausführen . Beachten Sie, dass Sie einen String in timestamp umwandeln können:

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

Sie könnten einen current_timestamp in timestamp umwandeln wodurch die Zeitzone entfernt wird:

select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

Sie können die Zeitzone wie folgt loswerden:

select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

Aber wenn Sie die Zeitzone wirklich zurückhaben möchten, können Sie Folgendes tun:

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

Mit extract:

können Sie herausziehen, was Sie wollen
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

Und diese Monstrosität:

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40