2016-12-01 8 views
0

Meine Konsole ist PST. Datenbankserver und gespeicherte Zeiten sind GMT.Indizierung Zeitstempel für bestimmte Zeitzone

Ich habe zum Ausführen von Abfragen in etwa so:

SELECT x,y,z 
FROM tbl_msg 
WHERE (msg_datetime AT TIME ZONE 'BST') BETWEEN '2016-11-21'::date and '2016-11-22'::date; 

Indexing 101 sagt, dass auf msg_datetime Durchführung dieser Operation wird nun den Index vermeiden, und das ist, was ich sehe.

Also brauche ich Beratung mit einer Indexlösung dafür.

Kann ich diese Zeitzone indexieren? oder ändern Sie diese Abfrage so, dass sie diese Zeiten in BST abfragt, konvertiert in GMT?

Antwort

0

Sie sollten msg_datetime Spalte des Typs timestamp with time zone (oder kürzere Alias ​​timestamptz) mit normalem Index haben.

Dann, um Daten für diese 2 Tage zu erhalten, sollten Sie:

set timezone 'Europe/London'; -- once, on connection start 
SELECT x,y,z 
FROM tbl_msg 
WHERE 
    msg_datetime>='2016-11-21 00:00:00' 
    and 
    msg_datetime<'2016-11-23 00:00:00'; 

Sie keine gewöhnlichen timestamp verwenden sollte, da es ohne Informationen darüber, welche eigentlich gemeint Zeitzone es wörtliche Datum und Uhrzeit speichert. Ein timestamp with time zone Typ konvertiert automatisch die konfigurierte Zeit Ihres Clients in die interne Repräsentation (die in UTC ist) und zurück. Sie können Zeitstempel auch aus einer nicht standardmäßigen Zeitzone ausdrücken, z. B. '2016-11-23 00:00:00 Asia/Tokyo'.

Auch sollten Sie nicht verwenden BST - weil Sie GMT im Winter verwenden müssen und sich daran erinnern, wann zu welcher verwenden. Sie sollten "Europa/London" oder andere "Stadt" -Zeitzonen (list) verwenden, die sowohl im Sommer als auch im Winter richtig sind.

+0

Das ist interessant Einstellung der Zeitzone bei Verbindung. Ich habe nur das Casting "AT TIME ZONE 'XXX'" gesehen. Dies könnte die Antwort sein, die mir erlaubt, eine Zeit als BST zu übergeben und es in GMT/UTC umgewandelt zu haben, anstatt GMT/UTC zu BST zu werfen. –

+0

Ich sehe Sie erwähnen, nicht mit BST. Das ist der ganze Grund, warum ich so werfen muss. Die Benutzer sind BST und möchten mithilfe von BST-Begriffen in der Anwendung suchen. Deshalb werfe ich die Daten als eine andere Zeitzone, weil wir eine zeitzonensensitive Konvertierung zulassen müssen, so dass diese Stunde berücksichtigt werden kann, wenn es sein muss –

+0

Sie irren sich - Sie haben keine BST-Benutzer. Sie haben vielleicht "Europa/London" -Benutzer, die BST-Zeitzone (UTC + 1) für ein halbes Jahr (wie heute nicht, da es Winter in der nördlichen Hemisphäre ist) und GMT-Zeitzone für ein weiteres halbes Jahr (wie heute) verwenden. Sie können zum Beispiel "Europa/Warschau" Kunden haben, die CEST (UTC + 2) im Sommer und CET im Winter benutzen (was auch UTC + 1 ist). – Tometzky

Verwandte Themen