PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Valeur de décalage du fuseau horaire du serveur

Pour le fuseau horaire, vous pouvez :

SHOW timezone;

ou l'équivalent :

SELECT current_setting('TIMEZONE');

mais cela peut être dans n'importe quel format accepté par le serveur, il peut donc renvoyer UTC , 08:00 , Australia/Victoria , ou similaire.

Malheureusement, il ne semble pas y avoir de fonction intégrée pour signaler le décalage horaire par rapport à UTC que le client utilise en heures et en minutes, ce qui me semble un peu fou. Vous pouvez obtenir le décalage en comparant l'heure actuelle en UTC à l'heure actuelle localement :

SELECT age(current_timestamp AT TIME ZONE 'UTC', current_timestamp)`

... mais IMO c'est plus propre d'extraire le décalage tz en secondes du current_timestamp et convertir en intervalle :

SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');

Cela correspondra au résultat souhaité, sauf qu'il ne produit pas de zéro non significatif, donc -05:00 est juste -5:00 . Malheureusement, il semble impossible d'obtenir to_char pour produire un zéro non significatif pendant des heures, me laissant avec le formatage manuel laid suivant :

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone_hour FROM current_timestamp),'FM00')||':'||
       to_char(extract(timezone_minute FROM current_timestamp),'FM00');
$$ LANGUAGE 'SQL' STABLE;

Crédit à Glenn pour timezone_hour et timezone_minute au lieu du hack que j'ai utilisé plus tôt avec extract(timezone from current_timestamp) * INTERVAL '1' second) et un CTE.

Si vous n'avez pas besoin du zéro non significatif, vous pouvez utiliser :

CREATE OR REPLACE FUNCTION oracle_style_tz() RETURNS text AS $$
SELECT to_char(extract(timezone from current_timestamp) * INTERVAL '1' second, 'FMHH24:MM');
$$ LANGUAGE 'SQL' STABLE;

Voir aussi :