2010-01-21 36 views
32

Mi aplicación web almacena todas las marcas de tiempo en UTC sin zonas horarias. Tengo un script shell/psql que devuelve una lista de inicios de sesión recientes, y quiero que ese script muestre los tiempos de inicio de sesión en la zona horaria local del servidor (que puede variar dependiendo de dónde se encuentre el servidor y con el horario de verano).Desfase de zona horaria local en PostgreSQL

Para obtener un intervalo que representa la diferencia entre la zona horaria de mi servidor de base de datos y GMT, actualmente estoy usando este truco:

SELECT age(now() at time zone 'UTC', now()); 

que funciona, pero hay una manera más sencilla?

Hay un parámetro de configuración del servidor llamado "zona horaria" que devuelve una cadena de zona horaria válida, pero no creo que sea posible acceder a esos parámetros en una consulta. (Supongo que es una cuestión aparte, sino una respuesta a ella sería resolver el problema de zona horaria.)

+0

Gracias por la pregunta. Agregué un párrafo que explica por qué quiero obtener la diferencia. – TimH

Respuesta

51
SELECT current_setting('TIMEZONE') 

Esto se puede utilizar en una consulta, sin embargo, esto no da una diferencia numérica.

Su solución está bien.

+0

Gracias, eso es lo que necesitaba saber. Esto funcionará: SELECCIONE some_table.utc_timestamp en la zona horaria current_setting ('TIMEZONE'); Y eso es mucho más claro para alguien que lee el código que mi hack. – TimH

+0

El único inconveniente de esto es que puede producir un desplazamiento como '-05: 00', un nombre de zona horaria de longitud completa como 'Australia/Perth', o incluso una abreviatura potencialmente ambigua como 'EST'. –

+1

@CraigRinger: todo lo devuelto por 'CURRENT_SETTING ('timezone')' se puede alimentar a 'AT TIME ZONE' sin problemas. – Quassnoi

5

Para obtener # de segundos de diferencia como un entero, he utilizado simplemente:

select extract(timezone from now());