web-dev-qa-db-de.com

Aktuelle Uhrzeit in UTC als Standardwert in PostgreSQL verwenden

Ich habe eine Spalte vom Typ TIMESTAMP WITHOUT TIME ZONE und möchte diesen Wert auf die aktuelle Uhrzeit in UTC setzen. Die aktuelle Uhrzeit in UTC zu ermitteln ist einfach:

postgres=# select now() at time zone 'utc';
          timezone          
----------------------------
 2013-05-17 12:52:51.337466
(1 row)

Wie verwendet man den aktuellen Zeitstempel für eine Spalte:

postgres=# create temporary table test(id int, ts timestamp without time zone default current_timestamp);
CREATE TABLE
postgres=# insert into test values (1) returning ts;
             ts             
----------------------------
 2013-05-17 14:54:33.072725
(1 row)

Aber das nutzt lokale Zeit. Der Versuch, dies zu UTC zu erzwingen, führt zu einem Syntaxfehler:

postgres=# create temporary table test(id int, ts timestamp without time zone default now() at time zone 'utc');
ERROR:  syntax error at or near "at"
LINE 1: ...int, ts timestamp without time zone default now() at time zo...
116

Eine Funktion wird nicht einmal benötigt. Fügen Sie einfach den Standardausdruck in Klammern ein:

create temporary table test(
    id int, 
    ts timestamp without time zone default (now() at time zone 'utc')
);
234
Daniel Vérité

Wickle es in eine Funktion:

create function now_utc() returns timestamp as $$
  select now() at time zone 'utc';
$$ language sql;

create temporary table test(
  id int,
  ts timestamp without time zone default now_utc()
);
23

Noch eine andere Lösung: 

timezone('utc', now())
20
martti

Wie wäre es mit

now()::timestamp

Wenn Ihr anderer Zeitstempel keine Zeitzone hat, ergibt diese Besetzung den passenden Typ "Zeitstempel ohne Zeitzone" für die aktuelle Zeit.

Ich würde jedoch gerne lesen, was andere über diese Option denken. Ich vertraue immer noch nicht auf mein Verständnis dieses Zeitzonen-Zeugnisses "mit/ohne".

14
Risadinha

Funktion existiert bereits: Timezone ('UTC' :: text, now ())

1
user10259440

Dies sind 2 gleichwertige Lösungen:

(Verwenden Sie 'UTC' für zone und now() für timestamp)

  1. timestamp AT TIME ZONE zone - SQL-Standard-konform
  2. timezone(zone, timestamp) - wahrscheinlich lesbarer

Die Funktion Zeitzone (Zone, Zeitstempel) entspricht der SQL-konformen Konstrukt-Zeitstempelzone AT TIME ZONE.


Erläuterung:

  • zone kann entweder als Textzeichenfolge (z. B. 'UTC') oder als Intervall (z. B. INTERVAL '-08:00') angegeben werden - hier ist eine Liste von allen verfügbaren Zeitzonen
  • timestamp kann ein beliebiger Wert vom Typ timestampsein. _
  • now() gibt einen Wert vom Typ timestamp (genau das, was wir brauchen) mit der Standardzeitzone Ihrer Datenbank (z. B. 2018-11-11T12:07:22.3+05:00) zurück.
  • timezone('UTC', now()) wandelt unsere aktuelle Zeit (vom Typ Zeitstempel mit Zeitzone) in das Zeitzonenäquivalent in UTC.
    E., SELECT timestamp with time zone '2020-03-16 15:00:00-05' AT TIME ZONE 'UTC' gibt 2020-03-16T20:00:00Z zurück.

Dokumente: Zeitzone ()

0
lakesare