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

So konvertieren Sie eine Zeichenfolge in einen Zeitstempel ohne Zeitzone

Zeichenfolgendarstellung eines timestamp (=timestamp without time zone ) hängt von Ihren Gebietsschemaeinstellungen ab. Um Zweideutigkeiten zu vermeiden, die zu Datenfehlern führen oder Postgres eine Ausnahme ausspuckt, haben Sie daher zwei Möglichkeiten:

1.) Verwenden Sie das ISO 8601-Format , was mit any genauso funktioniert Gebietsschema oder DateStyle Einstellung:

'2013-08-20 14:52:49'

Je nach Anwendungsfall müssen Sie das Zeichenfolgenliteral möglicherweise explizit umwandeln, wenn der Datentyp nicht aus dem Kontext abgeleitet werden kann:

'2013-08-20 14:52:49'::timestamp

2.) Wandeln Sie den String in timestamp um mit to_timestamp() mit passendem Vorlagenmuster:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')

Dies gibt timestamptz zurück , wobei die aktuelle Zeitzoneneinstellung angenommen wird. Typischerweise (wie bei einer Zuweisung) wird der Typ entsprechend erzwungen. Für timestamp , bedeutet dies, dass der Zeitversatz abgeschnitten wird und Sie den erwarteten Wert erhalten. Wenn der Zieltyp nicht aus dem Kontext abgeleitet werden kann, müssen Sie möglicherweise explizit umwandeln:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss')::timestamp

Da dies einfach den Zeitversatz entfernt, ergibt sich der erwartete Wert. Oder verwenden Sie den AT TIME ZONE Konstrukt mit einer Zeitzone Ihrer Wahl:

to_timestamp('20/8/2013 14:52:49', 'DD/MM/YYYY hh24:mi:ss') AT TIME ZONE 'UTC'

Während die Zielzeitzone dieselbe ist wie Ihre aktuelle timezone Einstellung, findet keine Transformation statt. Andernfalls wird der resultierende Zeitstempel entsprechend transponiert. Weiterführende Literatur:

  • Zeitzonen in Rails und PostgreSQL komplett ignorieren