2017-09-21 4 views
1

Ich benutze postgresql. Und ich möchte feststellen, ob eine bestimmte Zeit ist in DST oder nicht in Postgresql von SQL oder SQL Funktionen erstellt von CREATE FUNCTION Aussagen.Wie zu bestimmen, ob eine bestimmte Zeit in einer bestimmten Zeitzone DST ist oder nicht in Postgresql?

Zum Beispiel. In der Zeitzone Europe/Rome ist die Ortszeit von 2017-03-26 03:00:00 bis 2017-10-29 02:59:59 in DST.

  • Wenn die gegebene Zeit 2017-04-01 00:00:00 ist, dann sollte das Ergebnis wahr sein.

  • Wenn die angegebene Zeit 2017-11-01 00:00:00 ist, dann sollte das Ergebnis falsch sein.

Wie SQL verwenden, um die Funktion in Postgresql zu realisieren? Gibt es eine Übergangstabelle, die die Übergangszeitpunkte speichert, wie die Ergebnisse von zdump -v Europe/Rome Befehl in Linux? Oder kann eine interne Funktion dies tun?

Tabellen nachschlagen ist immer langsam. Auf der Suche nach einem schnellen Weg.

Antwort

1

Ich gehe davon aus smth wie:

t=# create or replace function dst(t timestamp, tz text) returns boolean as 
$$ 
declare 
begin 
    return (select t at time zone 'UTC' - t at time zone tz = utc_offset from pg_timezone_names where name = tz); 
end; 
$$ language plpgsql; 
CREATE FUNCTION 
t=# select dst('2017-04-01 00:00:00','Europe/Rome'); 
dst 
----- 
t 
(1 row) 

t=# select dst('2017-11-01 00:00:00','Europe/Rome'); 
dst 
----- 
f 
(1 row) 

ich plpgsql statt SQL für zusätzliche Logik verlassen, beispielsweise die Überprüfung pg_timezone_names.is_std oder so. wenn nicht benötigt - Wechsel zu SQL wird schneller

+0

Danke für Hilfe. Gibt es einen schnelleren Weg, um das Problem zu lösen? Ein Tisch nachzuschlagen ist immer langsam. – Starwalker

Verwandte Themen