Re: Duda sobre time en Postgres

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: raul velez <demoramucho(at)yahoo(dot)es>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Duda sobre time en Postgres
Date: 2010-12-17 19:59:06
Message-ID: 1292615025-sup-3536@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Excerpts from raul velez's message of mié dic 15 15:53:03 -0300 2010:
> Saludos a todos, quisiera saber cuando usar "time with time zone" y "time without time zone" se que el primero es para incluir la zona horaria y el segundo no, pero en que casos podría usar cada uno??? En que casos lo usarían ustedes??

Lo que sabes, o mejor dicho, lo que crees saber, es erróneo. Ninguno de
los dos tipos almacena el huso horario (TZ).

La diferencia entre los dos tipos es cómo se interpreta la hora.
TIMESTAMP WITHOUT TIME ZONE (y además TIMESTAMP, que es un alias) asume
que tú sabes perfectamente de qué TZ es la hora que le estás pasando, y
que no necesitas que sea consistente con los TZs de otros valores de ese
mismo tipo; o bien, que tienes 100% seguridad que siempre estarán todos
en el mismo TZ. Cosa que, como ya te dijeron en la otra respuesta, es
difícil de asegurar puesto que uno nunca tiene claridad de las líneas de
desarrollo futuro de sus sistemas.

En cambio, un TIMESTAMP WITH TIME ZONE (y su alias TIMESTAMPTZ) asume
que la hora está en el TZ local, configurado con la variable TimeZone
(que puedes cambiar en el archivo postgresql.conf o usando la orden
SET). Para almacenarla, le quita la diferencia de horas de GMT (es
decir, lo “rota” a GMT) y lo guarda de esa forma; es decir, en el
almacenamiento, todos los valores de una columna de tipo timestamptz van
a estar en GMT. Al momento de desplegar un valor, se vuelve a rotar
desde GMT hasta el TZ actual agregándole la diferencia de horas de GMT.

Si lo piensas detenidamente, te darás cuenta que esto significa que si
tienes un usuario en un TZ que ingresa una hora, y luego viene otro
usuario en un TZ distinto que la examina, el valor de la hora va a ser
distinto para cada uno de ellos: para cada uno, va a estar en su TZ
local.

Esta es una característica tremendamente útil y generalmente mal
comprendida.

Entonces, lo recomendable es que almacenes el TZ que se debe aplicar en
cada momento (por ej. si estás haciendo un sistema con usuarios, guardes
el TZ de cada usuario) y hagas cambies el parámetro TimeZone cada vez,
de manera que todas las horas del sistema sean consistentes y
coherentes, sobre todo si los usuarios interactúan con otros que están
en TZs distintos. Haciéndolo de esta forma te ahorras muchos dolores de
cabeza en el lado de tu aplicación, puesto que te evitas tener que
implementar el código para hacer las rotaciones horarias.

Mi recomendación: nunca uses los tipos TIMESTAMP WITHOUT TIME ZONE
ni TIMESTAMP a menos que entiendas muy bien por qué.

Nota final: existe el operador AT TIME ZONE que permite cambiar un
TIMESTAMP WITH TIME ZONE en TIMESTAMP WITHOUT TIME ZONE y viceversa.

--
Álvaro Herrera <alvherre(at)commandprompt(dot)com>
The PostgreSQL Company - Command Prompt, Inc.
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message emorras 2010-12-17 20:05:55 ODBC o similar
Previous Message Guido Ojeda 2010-12-17 19:45:47 Re: pg_dump - Copias de Seguridad