2016-07-25 20 views
0

Nach dem Ändern der Tabelle Timestamptz für alle Zeitspalten zu verwenden, sehe ich sehr seltsames Verhalten, wenn wählen basierend auf Zeitbereich. Wenn die Zeitzone des Benutzers UTC ist, funktioniert es, das Ergebnis ist korrekt. Wenn die Zeitzone des Benutzers nicht UTC ist, ist das Ergebnis gleich Null. Ich würde erwarten, dass das Ergebnis nicht von der Zeitzone des Benutzers abhängt.Postgres Timestamptz Spalte und Benutzer Zeitzone

In Abfrage erkläre ich, dass Postgres Zeitkonstanten korrekt konvertieren. Im ersten Fall (UTC) es zeigt

'2016-07-25 07:00:00+00'::timestamp with timezone 
'2016-07-25 08:00:00+00'::timestamp with timezone 

Zweiter Fall (GB) zeigt

'2016-07-25 08:00:00+01'::timestamp with timezone 
'2016-07-25 09:00:00+01'::timestamp with timezone 

Was noch ungerade ist, ist es nicht vollständig nur funktioniert, wenn Zeitdifferenz eine Stunde. Wenn ich zwei Stunden lang von 8 Uhr morgens bis 10 Uhr morgens filtere, gibt die Abfrage ein Ergebnis ungleich Null zurück. Es funktioniert wie folgt

count(*) from 08:00 to 09:00 - zero 
count(*) from 09:00 to 10:00 - zero 
count(*) from 08:00 to 10:00 = actual count from 09:00 to 10:00 

Es scheint, dass es einen Fehler in Bereich Konvertierungen gibt. Die Startzeit wird konvertiert, die Endzeit jedoch nicht.

Ich frage mich, ob jemand dieses Problem vorher gesehen hat. Postgres ist 9.3.4, läuft auf Ubuntu.

Definition von modified Spalte

... 
modified timestamp with time zone NOT NULL DEFAULT now(), 
... 

ERKLÄREN

Aggregate (cost=374.84..374.85 rows=1 width=0) 
    Output: count(*) 
    -> Index Only Scan using modified_idx on public.table1 (cost=0.56..362.14 rows=5079 width=0) 
     Output: modified 
     Index Cond: ((table1.modified >= '2016-07-25 08:00:00+01'::timestamp with time zone) AND (table1.modified < '2016-07-25 09:00:00+01'::timestamp with time zone)) 
+0

Bitte zeigen Sie die Definition von 'table1'. Wenn die Spalte "Modified" vom Typ "Timestamp" ist, ändert sich ihre Bedeutung, wenn Sie die Zeitzone ändern. –

+0

@LaurenzAlbe Ich habe Frage mit Spaltendefinition geändert – Alsin

+0

Das sieht unmöglich aus. Kannst du die 'EXPLAIN (VERBOSE)' Ausgabe veröffentlichen? –

Antwort

0

Dies scheint unmöglich, und die einzige Erklärung, die den Sinn kommt, ist, dass der Index beschädigt ist.

REINDEX INDEX modified_idx; 

den Index neu zu erstellen, hoffentlich das wird das Problem beheben.