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 ZONEvalores 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:00sem 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:00sem 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 ZONEo WITHOUTtipo.
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:00em 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 ZONEe não do WITHOUTtipo.
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 ZONEtipo.
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 ZONEcomo 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.