Sí. Hay casos de uso para TIMESTAMP WITHOUT TIME ZONE
.
- En las aplicaciones comerciales comunes, este tipo solo se usaría para:
- Reserva de citas futuras
- Representando la misma hora del día en varias zonas horarias, como el mediodía del 23 en Tokio y en París (dos momentos diferentes, horas separadas, la misma hora del día)
- Para el seguimiento de momentos, puntos específicos en la línea de tiempo, use siempre
TIMESTAMP WITH TIME ZONE
, no WITHOUT
.
TIMESTAMP WITHOUT TIME ZONE
los valores no son un punto en la línea de tiempo, no son momentos reales. Representan una idea aproximada sobre los posibles momentos, posibles puntos en la línea de tiempo a lo largo de un rango de aproximadamente 26-27 horas (el rango de zonas horarias de todo el mundo). No tienen un significado real hasta que aplique una zona horaria o un desplazamiento desde UTC .
Ej: navidad
Por ejemplo, supongamos que necesita registrar el inicio de días festivos / días santos.
Table: holiday_
Column: year_ Type: SMALLINT
Column: description_ Type: VARCHAR
Column: start_ Type: TIMESTAMP WITHOUT TIME ZONE
Para registrar el hecho de que la Navidad comienza después de la medianoche del 25 de diciembre de este año, tenemos que decir 2016-12-25 00:00:00
sin zona horaria. Temprano en los días de Papá Noel visita Auckland, Nueva Zelanda, justo después de la medianoche, ya que es una de las primeras noches en el mundo. Luego se dirige hacia el oeste, a medida que pasa la medianoche siguiente, y pronto llega a Filipinas. Luego, los renos se mueven en dirección oeste, llegando a la India a la medianoche, que ocurre varias horas después de la medianoche de Auckland. Mucho más tarde todavía es medianoche en París FR, y aún más tarde en Montreal CA. Todas estas visitas de Santa suceden en diferentes momentos, es tiempo , pero todas ocurrieron poco después de la medianoche, según la medianoche de cada localidad.
Por lo tanto, grabar 2016-12-25 00:00:00
sin zona horaria al comienzo de la Navidad es informativo y legítimo, pero solo vagamente. Hasta que diga "Navidad en Auckland" o "Navidad en Montreal", no tenemos un momento específico en el tiempo. Si está grabando el momento real cada vez que el trineo aterrizó, usaría en TIMESTAMP WITH TIME ZONE
lugar del WITHOUT
tipo.
Similar a la Navidad es la víspera de Año Nuevo. Cuando cae el Times Square Ball en Nueva York , la gente en Seattle todavía está enfriando su champán y preparando sus cuernos de fiesta . Sin embargo, registraríamos la idea del momento de Año Nuevo como 2017-01-01 00:00:00
en a TIMESTAMP WITHOUT TIME ZONE
. Por el contrario, si queremos registrar cuándo cayó la pelota en Nueva York, o cuando la gente en Seattle tocó sus cuernos, en su lugar usaríamos TIMESTAMP WITH TIME ZONE
(no WITHOUT
) para registrar esos momentos reales, cada tres horas separados el uno del otro.
Ej: turnos de fábrica
Otro ejemplo podría ser registrar una política que implique la hora del reloj de pared en varias ubicaciones. Digamos que tenemos fábricas en Detroit, Düsseldorf y Delhi. Si decimos que en las tres fábricas el primer turno comienza a las 6 AM con un receso para el almuerzo a las 11:30 AM, eso podría registrarse como a TIMESTAMP WITHOUT TIME ZONE
. Nuevamente, esta información es útil de una manera vaga, pero no indica un momento específico en el tiempo hasta que apliquemos una zona horaria. Un nuevo día amanece más temprano en el este. Entonces, la fábrica de Delhi será la primera en abrir a las 6 AM. Horas después, la fábrica de Düsseldorf comienza a funcionar a las 6 de la mañana. Pero la fábrica de Detroit en realidad no abrirá hasta otras seis horas más tarde, cuando sean las 6 AM.
Contraste esta idea (de cuándo comienza generalmente el turno de fábrica) con el hecho histórico de cuándo hizo cada trabajador de fábrica para iniciar su turno en un día en particular. El reloj de entrada es un momento real, un punto real en la línea de tiempo. Entonces registraríamos eso en una columna de tipo en TIMESTAMP WITH TIME ZONE
lugar del WITHOUT
tipo.
Entonces, sí, hay casos de uso legítimos para TIMESTAMP WITHOUT TIME ZONE
. Pero en mi experiencia con las aplicaciones comerciales, son relativamente raras. En los negocios, tendemos a preocuparnos por los momentos reales: cuándo llegó realmente la factura, cuándo entra en vigencia exactamente ese contrato, en qué momento se ejecutó esa transacción bancaria. Entonces, en situaciones tan comunes, queremos el TIMESTAMP WITH TIME ZONE
tipo.
Para obtener más información, consulte mi Respuesta a la pregunta similar: ¿Debo almacenar marcas de tiempo UTC o tiempo local para turnos?
Postgres
Tenga en cuenta que Postgres específicamente nunca guarda la información de zona horaria especificada al insertar una marca de tiempo.
TIMESTAMP WITH TIME ZONE
- Cualquier zona horaria especificada o desplazamiento incluido con los datos de entrada se usa para ajustar el valor a UTC y se almacena. La información de zona / desplazamiento aprobada se descarta. Piensa en
TIMESTAMP WITH TIME ZONE
como TIMESTAMP WITH RESPECT FOR TIME ZONE
.
- Una entrada de las 12:00 del mediodía del 7 de marzo de este año en la India tendrá su hora del día ajustada a UTC restando cinco horas y media: 6:30 a.m.
TIMESTAMP WITHOUT TIME ZONE
- Cualquier zona horaria especificada o desplazamiento incluido con los datos de entrada se ignora por completo.
- Una entrada de las 12:00 del mediodía del 7 de marzo de este año en la India se registra como las 12:00 del 7 de marzo de este año sin ajustes.
El estándar SQL apenas toca temas de comportamiento y tipos de datos de fecha y hora. Por lo tanto, la base de datos varía ampliamente en el manejo de fecha y hora.