2016-12-08 3 views
1

Wolke jemand mir erklären, warum Zeitstempel Casting zu Datum in psql mir falsch Wert gibt? Ich habe in meinem db gespeichert Zeitstempelwert 2016.12.04 00: 05: 09.748000 und meine Maschine Zeit ist in UTC und Datentyp in psqlTIMESTAMP WITH TIME ZONE ist. Wenn ich dies tat,Psql falsches Datum von Zeitstempel

orders.completed :: date

es mir 2016.12.03 gibt. Problem ist, dass, wenn ich einige Befehle um Mitternacht habe, Aggregatfunktionen mir falsche Werte geben. Gibt es einen Weg, um es zu lösen? Ich würde mich über jede Hilfe freuen!

+0

versuchen, Code läuft in meiner Antwort (TZ ajusting zu Midihgt Rand natürlich benötigt) ändert es das Datum? –

Antwort

1

Try this:

(orders.completed::timestamp at time zone 'UTC' at time zone 'America/Los_Angeles')::date; 

Sie benötigen eine Zeitzone in Abfrage

+0

Danke, es funktioniert, aber mein Problem wird woanders sein, weil es mein Problem nicht gelöst hat. Aggregatfunktionen geben immer noch falsche falsche Werte zurück, aber trotzdem danke. – inle

0

Hm einzufügen, ich kann es nicht reproduzieren:

b=# set timezone to "GMT+10"; 
SET 
b=# create table edge (t timestamptz); 
CREATE TABLE 
b=# insert into edge select now(); 
INSERT 0 1 
b=# select t::date, t from edge; 
    t  |    t 
------------+------------------------------- 
2016-12-08 | 2016-12-08 00:18:30.740132-10 
(1 row) 
+0

Hm, das ist seltsam. Ich führe einen Test mit diesem: now() bei TIME ZONE 'GMT + 11' mit Ergebnis 2016-12-08 00: 40: 39.717069 und (jetzt() bei TIME ZONE 'GMT + 11') :: Datum mit Ergebnis 2016-12-07. – inle

+0

@inle so mit meinem Beispiel funktioniert es als angenommen? dann überprüfe, ob du den Datumswert nicht irgendwo speicherst und 5 Minuten später (das ist schon ein anderer Tag) verwende den VALUE von gestern –