Sim. Existem casos de uso para TIMESTAMP WITHOUT TIME ZONE
.
- Em aplicativos comerciais comuns, esse tipo seria usado apenas para:
- Marcando compromissos futuros
- Representando a mesma hora do dia em vários fusos horários, como o meio-dia do dia 23 em Tóquio e em Paris (dois momentos diferentes, separados por horas, a mesma hora do dia)
- Para rastrear momentos, pontos específicos na linha do tempo, sempre use
TIMESTAMP WITH TIME ZONE
, não WITHOUT
.
TIMESTAMP WITHOUT TIME ZONE
valores não são um ponto na linha do tempo, nem momentos reais. Eles representam uma idéia aproximada de momentos em potencial , possíveis pontos na linha do tempo ao longo de um período de 26 a 27 horas (o intervalo de fusos horários em todo o mundo). Eles não têm significado real até você aplicar um fuso horário ou um desvio do UTC .
Ex: Natal
Por exemplo, suponha que você precise registrar o início dos feriados / dias santos.
Table: holiday_
Column: year_ Type: SMALLINT
Column: description_ Type: VARCHAR
Column: start_ Type: TIMESTAMP WITHOUT TIME ZONE
Para registrar o fato de que o Natal começa depois da meia-noite de 25 de dezembro deste ano, precisamos dizer 2016-12-25 00:00:00
sem fuso horário. No início do dia do Papai Noel, ele visita Auckland na Nova Zelândia logo após a meia-noite, pois é uma das primeiras noites do mundo. Então ele segue seu caminho para o oeste, como acontece a próxima meia-noite, logo chegando às Filipinas. Em seguida, as renas seguem em direção oeste, chegando à Índia à meia-noite, o que ocorre várias horas depois da meia-noite de Auckland. Muito mais tarde ainda é meia-noite em Paris FR, e ainda mais tarde em Montreal CA. Todas essas visitas do Papai Noel acontecem em momentos diferentes , mas ainda assim logo após a meia-noite, por meia-noite de cada localidade.
Portanto, gravar 2016-12-25 00:00:00
sem fuso horário no início do Natal é informativo e legítimo, mas apenas vagamente. Até você dizer "Natal em Auckland" ou "Natal em Montreal", não temos um momento específico. Se você estiver gravando o momento real toda vez que o trenó tocar, você deve usar TIMESTAMP WITH TIME ZONE
o WITHOUT
tipo.
Semelhante ao Natal é a véspera de Ano Novo. Quando o Times Square Ball cai em Nova York , as pessoas em Seattle ainda estão tomando champanhe e preparando os chifres da festa . No entanto, gravaríamos a ideia do momento do ano novo como 2017-01-01 00:00:00
em a TIMESTAMP WITHOUT TIME ZONE
. Por outro lado, se queremos gravar quando a bola caiu em Nova York ou quando as pessoas em Seattle tocaram a buzina, em vez disso, usaríamos TIMESTAMP WITH TIME ZONE
(não WITHOUT
) para registrar esses momentos reais, cada três horas separados um do outro.
Ex: turnos de fábrica
Outro exemplo pode ser o registro de uma política que envolve o horário do relógio de parede em vários locais. Digamos que temos fábricas em Detroit, Düsseldorf e Delhi. Se dissermos que, nas três fábricas, o primeiro turno começa às 6 da manhã, com um intervalo para o almoço às 11:30, que pode ser registrado como a TIMESTAMP WITHOUT TIME ZONE
. Novamente, essas informações são úteis de maneira vaga, mas não indicam um momento específico no tempo até aplicarmos um fuso horário. Um novo dia amanhece mais cedo no leste. Assim, a fábrica de Délhi será a primeira a abrir às seis da manhã. Horas depois, a fábrica de Düsseldorf começa a trabalhar às seis da manhã. Mas a fábrica de Detroit não abrirá até outras seis horas depois, quando as seis da manhã acontecerem.
Compare essa idéia (de quando o turno da fábrica geralmente começa) ao fato histórico de quando cada operário entrou em ação para iniciar seu turno em um determinado dia. A entrada do relógio é um momento real, um ponto real na linha do tempo. Então, gravaríamos isso em uma coluna do tipo TIMESTAMP WITH TIME ZONE
e não do WITHOUT
tipo.
Portanto, sim, existem casos de uso legítimos para TIMESTAMP WITHOUT TIME ZONE
. Mas, na minha experiência com aplicativos de negócios, eles são relativamente raros. Nos negócios, tendemos a nos preocupar com momentos reais: quando a fatura realmente chegou, quando exatamente esse contrato entra em vigor, em que momento a transação bancária foi executada. Então, em situações tão comuns, queremos o TIMESTAMP WITH TIME ZONE
tipo.
Para obter mais discussões, consulte minha resposta à pergunta semelhante. Devo armazenar registros de data e hora UTC ou hora local para turnos
Postgres
Observe que o Postgres especificamente nunca salva as informações de fuso horário especificadas ao inserir um carimbo de data / hora.
TIMESTAMP WITH TIME ZONE
- Qualquer fuso horário ou deslocamento especificado incluído nos dados de entrada é usado para ajustar o valor para UTC e armazenado. A informação da zona / deslocamento passada é então descartada. Pense
TIMESTAMP WITH TIME ZONE
como TIMESTAMP WITH RESPECT FOR TIME ZONE
.
- Uma entrada do meio-dia de 7 de março deste ano na Índia terá sua hora do dia ajustada para UTC, subtraindo cinco horas e meia: 6h30.
TIMESTAMP WITHOUT TIME ZONE
- Qualquer fuso horário ou deslocamento especificado incluído nos dados de entrada é totalmente ignorado.
- Uma entrada de 12:00 no dia 7 de março deste ano na Índia é registrada como 12:00 no dia 7 de março deste ano sem nenhum ajuste.
O padrão SQL mal toca em questões de tipos e comportamento de dados de data e hora. Portanto, o banco de dados varia amplamente na manipulação da data e hora.