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 :
- Décalage du fuseau horaire local dans PostgreSQL
- Comment connaître un fuseau horaire d'un horodatage dans postgresql 8.3