¿Cómo obtengo el nombre de la zona horaria actual en Postgres 9.3?

81

Quiero obtener el nombre de la zona horaria actual. Lo que ya logré es obtener la utc_offset/ la abreviatura de la zona horaria a través de:

SELECT * FROM pg_timezone_names WHERE abbrev = current_setting('TIMEZONE')

Esto me da todas las combinaciones Continente / Capital para esta zona horaria, pero no la exacta timezone. Por ejemplo, obtengo:

Europe/Amsterdam
Europe/Berlin

El servidor está adentro Berliny quiero obtener el nombre de la zona horaria del servidor.

El problema que tengo con CETeso es siempre UTC+01:00y no se tiene en cuenta DST iirc.

Deutro
fuente
El nombre correcto de la zona horaria para Berlín y Ámsterdam es Hora de Europa Central (CET). En general, los nombres y abreviaturas de las zonas horarias no están bien definidos; si bien existe una norma ISO, muchos países utilizan sus propias definiciones. La compatibilidad con PostgreSQL tampoco está completa, consulte postgresql.org/docs/9.4/static/datetime-config-files.html para obtener más detalles.
Patrick
1
En la tabla pg_timezone_names, CET se define como abreviatura y, por ejemplo, "Europa / Berlín" como nombre. Necesito el nombre y no la abreviatura.
Deutro
El enlace que di en mi comentario anterior le muestra cómo puede editar los archivos para proporcionar lo que necesita. Eso es tan bueno como parece.
Patrick
Entonces, ¿no hay forma de que Postgres me diga si estoy en "Europa / Berlín" o "Europa / Ámsterdam" solo que estoy en la zona horaria CET?
Deutro
¿Puedes editar tu pregunta y definir "Estoy dentro"? Un servidor se encuentra (generalmente) en una ubicación fija y la zona horaria se toma del sistema operativo o del archivo de configuración. El nombre tz es tan fijo como el servidor. Entonces, ¿realmente desea el nombre de la zona horaria del servidor o de los datos en la base de datos?
Patrick

Respuestas:

119

No creo que esto sea posible usando PostgreSQL solo en el caso más general. Cuando instala PostgreSQL, elige una zona horaria. Estoy bastante seguro de que el valor predeterminado es usar la zona horaria del sistema operativo. Eso generalmente se reflejará en postgresql.conf como el valor del parámetro "timezone". Pero el valor termina como "localtime". Puede ver esta configuración con la declaración SQL.

show timezone;

Pero si cambia la zona horaria en postgresql.conf a algo como "Europa / Berlín", show timezone;devolverá ese valor en lugar de "localtime".

Así que creo que su solución implicará establecer "timezone" en postgresql.conf en un valor explícito en lugar del "localtime" predeterminado.

Mike Sherrill 'Cat Recall'
fuente
Gracias por tu respuesta. Es un poco extraño que no sea posible obtener la zona horaria de Systems.
Deutro
3
Y para establecer la zona horaria puede utilizar set timezone to 'UTC'.
ivkremer
@ivkremer: set timezoneestablece la zona horaria para una sesión de cliente; no establece la zona horaria del servidor PostgreSQL.
Mike Sherrill 'Cat Recall'
@ MikeSherrill'CatRecall 'gracias, no lo revisé.
ivkremer
25

Esto puede ayudarlo o no a abordar su problema, OP, pero para obtener la zona horaria del servidor actual en relación con UTC ( UT1 , técnicamente), haga:

SELECT EXTRACT(TIMEZONE FROM now())/3600.0;

Lo anterior funciona extrayendo el desplazamiento relativo de UT1 en minutos y luego convirtiéndolo en horas usando el factor de 3600 segundos / hora.

Ejemplo:

SET SESSION timezone TO 'Asia/Kabul';
SELECT EXTRACT(TIMEZONE FROM now())/3600.0;
-- output: 4.5 (as of the writing of this post)

( documentos ).

koyae
fuente
6
Otro usuario sugirió usarlo SELECT EXTRACT(TIMEZONE_HOUR FROM now()), pero esto es un poco peligroso porque ignora el hecho de que existen zonas horarias medias y cuartos . @giladMayani
koyae
2
"Corea del Norte, Terranova, India, Irán, Afganistán, Venezuela, Birmania, Sri Lanka, las Marquesas y partes de Australia utilizan desviaciones de media hora de la hora estándar. Algunas naciones, como Nepal, y algunas provincias, como las islas Chatham, utilice desviaciones de un cuarto de hora ". ( enlace )
koyae
21

Parece funcionar bien en Postgresql 9.5 :

SELECT current_setting('TIMEZONE');
KotGaf
fuente
Ejecuté su comando y me devolvió 15,200 filas, aunque todas son la misma zona horaria.
Subhendu Mahanta
9

Ver esta respuesta: Fuente

Si la zona horaria no se especifica en postgresql.conf o como una opción de línea de comandos del servidor, el servidor intenta utilizar el valor de la variable de entorno TZ como zona horaria predeterminada. Si TZ no está definido o no es ninguno de los nombres de zona horaria conocidos por PostgreSQL, el servidor intenta determinar la zona horaria predeterminada del sistema operativo comprobando el comportamiento de la función de la biblioteca C localtime (). La zona horaria predeterminada se selecciona como la coincidencia más cercana entre las zonas horarias conocidas de PostgreSQL. (Estas reglas también se utilizan para seleccionar el valor por defecto de log_timezone, si no se especifica.) Fuente

Esto significa que si no define una zona horaria, el servidor intenta determinar la zona horaria predeterminada del sistema operativo comprobando el comportamiento de la función de la biblioteca C localtime ().

Si la zona horaria no se especifica en postgresql.conf o como una opción de línea de comandos del servidor, el servidor intenta utilizar el valor de la variable de entorno TZ como zona horaria predeterminada.

Parece que es posible configurar la zona horaria del sistema.

Obtenga la zona horaria local del sistema operativo desde el shell. En psql:

=> \! date +%Z
Igoranze
fuente
2
date +%ZEl comando devolverá la zona horaria del cliente, no el servidor al que se ha conectadopsql
Eugen Konkov
8

Puede acceder a la zona horaria mediante el siguiente script:

SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
  • current_setting ('TIMEZONE') le dará información de Continente / Capital de la configuración
  • pg_timezone_names La vista pg_timezone_names proporciona una lista de nombres de zonas horarias que son reconocidos por SET TIMEZONE, junto con sus abreviaturas asociadas, compensaciones UTC y estado de horario de verano.
  • La columna de nombre en una vista (pg_timezone_names) es el nombre de la zona horaria.

la salida será:

name- Europe/Berlin, 
abbrev - CET, 
utc_offset- 01:00:00, 
is_dst- false
Sachin R
fuente