2017-09-21 14 views
1

J'utilise postgresql. Et je veux déterminer si un temps donné est en heure d'été ou non dans postgresql par SQL ou SQL fonctions créées par CREATE FUNCTION instructions.Comment déterminer si une heure donnée dans un fuseau horaire donné est DST ou non dans postgresql?

Par exemple. Dans le fuseau horaire Europe/Rome, l'heure locale de 2017-03-26 03:00:00 à 2017-10-29 02:59:59 est en heure d'été.

  • Si le temps est donné 2017-04-01 00:00:00, le résultat doit être vrai.

  • Si le temps donné est 2017-11-01 00:00:00, le résultat doit être faux.

Comment utiliser SQL pour réaliser la fonction dans postgresql? Y at-il une table de transition qui stocke les points de temps de transition, comme les résultats de la commande zdump -v Europe/Rome dans Linux? Ou est-il une fonction interne peut le faire?

La recherche des tables est toujours lente. À la recherche d'un moyen rapide

Répondre

1

Je suppose smth comme:

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) 

Je laisse plpgsql au lieu de sql pour une logique supplémentaire, par exemple, la vérification pg_timezone_names.is_std ou ainsi. si non nécessaire - le passage à SQL sera plus rapide

+0

Merci pour votre aide. Existe-t-il un moyen plus rapide de résoudre le problème? Regarder une table est toujours lente. – Starwalker