sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL/JDBC y TIMESTAMP frente a TIMESTAMPTZ

Usar generalmente TIMESTAMPTZ

Aquí hay un consejo de David E. Wheeler, un experto en Postgres, en una entrada de blog cuyo título lo dice todo:
Usar siempre TIMESTAMP CON ZONA HORARIA (TIMESTAMPTZ)

Si está rastreando momentos reales, puntos específicos en la línea de tiempo, use TIMESTAMP WITH TIME ZONE .

Una excepción:partición

La única excepción de Wheeler es cuando se divide en marcas de tiempo, debido a limitaciones técnicas. Una rara excepción para la mayoría de nosotros.

Para obtener información sobre particiones, consulte doc y ver el Wiki .

Nombre inapropiado

Los tipos de datos nombran timestamp with time zone y timestamp without time zone son nombres inapropiados. En ambos casos, el valor de fecha y hora se almacena en UTC (sin compensación de zona horaria). Vuelve a leer la oración anterior. UTC, siempre. La frase "con zona horaria" significa "con atención a la zona horaria", no "almacenar la zona horaria junto con este valor". La diferencia entre los tipos es si se debe aplicar cualquier zona horaria durante el almacenamiento (INSERTAR o ACTUALIZAR) o la recuperación (consulta SELECCIONAR). (Este comportamiento se describe para Postgres -- Otras bases de datos varían ampliamente en este sentido.)

Más precisamente, se debería decir que TIMESTAMP SIN ZONA HORARIA almacena valores de fecha y hora sin zona horaria. Pero sin ninguna referencia de marco de tiempo, cualquiera que mire esos datos tendría que asumir (¿espero, rezar?) que los valores son UTC. Pero de nuevo, discuta ya que casi nunca debe usar este tipo.

Lea el documento atentamente y experimente un poco para aclarar su comprensión.

Sin zonas

Si desea almacenar la idea general de un tiempo posible en lugar de un momento específico, use el otro tipo, TIMESTAMP WITHOUT TIME ZONE .

Por ejemplo, la Navidad comienza este año en el primer momento del 25 de diciembre de 2017. Eso sería 2017-12-25T 00:00:00 sin indicador de zona horaria ni desplazamiento de UTC. Este valor es solo una vaga idea de los posibles momentos. No tiene significado hasta que aplicamos una zona horaria (o un desplazamiento). Así que almacenamos esto usando TIMESTAMP WITHOUT TIME ZONE .

Los duendes que trabajan en el Departamento de Logística de Eventos Especiales de Papá Noel aplicar las zonas horarias como parte de su proceso de planificación. La zona horaria más antigua es actualmente Pacific/Kiribati , 14 horas por delante de UTC. Los duendes programan la primera llegada de Santa allí. Los duendes programan un plan de vuelo que lleva a los renos a otras zonas horarias donde la medianoche llega poco después, como Pacific/Auckland. . Continúan yendo hacia el oeste a medida que llega la medianoche de cada zona. Horas más tarde en Asia/Kolkata , aún más tarde en Europe/Paris , aún más horas después en America/Montreal y así.

Los duendes registrarían cada uno de estos momentos de entrega específicos usando WITH TIME ZONE , mientras que esa idea general de Navidad quedaría almacenada como WITHOUT TIME ZONE .

Otro uso en apps empresariales para WITHOUT TIME ZONE está programando citas más allá de varias semanas. Los políticos de todo el mundo tienen una predilección inexplicable por jugar con el reloj y redefinir las reglas de las zonas horarias. Se unen al horario de verano (DST), dejan el horario de verano, comienzan el horario de verano en una fecha diferente o finalizan el horario de verano en una fecha diferente, o cambian sus relojes 15 minutos o media hora. Todos estos han sido realizados en los últimos años por Turquía, Estados Unidos, Rusia, Venezuela y otros.

Los políticos a menudo hacen estos cambios sin previo aviso. Entonces, si está programando una cita dental para seis meses antes de las 13:00, probablemente debería almacenarse como TIMESTAMP WITHOUT TIME ZONE o de lo contrario, los políticos pueden cambiar su cita al mediodía, a las 2 p. m. oa las 13:30.