Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQL- Diferença entre TIMESTAMP, DATE E TIMESTAMP COM TIMEZONE?


Os tipos de dados e as diferenças entre eles estão na documentação . A versão curta é:
  • DATE tem precisão de até um segundo sem suporte a fuso horário;
  • TIMESTAMP tem precisão de até frações de segundo (até nove casas decimais, mas seu sistema operacional também afeta isso), ainda sem suporte a fuso horário;
  • TIMESTAMP WITH TIME ZONE tem a mesma precisão que TIMESTAMP, mas também suporta fuso horário, como o nome sugere;
  • TIMESTAMP WITH LOCAL TIME ZONE ajusta o valor armazenado de e para o fuso horário local da sessão de criação/consulta.

Você pode encontrar este artigo interessante também.

Sempre que você estiver comparando valores de data e hora armazenados em seu banco de dados, você deve usar valores do mesmo tipo de dados para comparar. Você não quer ter que converter todos os valores na coluna para comparação, especialmente se a coluna estiver indexada. Se você tiver uma coluna DATE, compare com uma DATE - não compare como uma string e não confie em conversão de uma corda. Quando você faz:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'

você está contando que seu NLS_DATE_FORMAT seja DD-MON-YYYY e seu NLS_DATE_LANGUAGE seja inglês. Se outra pessoa executar a mesma consulta em outra sessão, suas configurações podem causar falha na consulta (ou, em alguns casos, fornecer resultados errados, o que pode ser pior). Para evitar o problema do idioma, é melhor usar números de meses em vez de nomes. Se você tiver uma variável de string para comparar, use TO_DATE() para converter a string em um DATE usando uma máscara de formato fixo conhecido - não confie no NLS. Se você tiver um valor fixo, faça o mesmo ou use um literal de data , que é mais curto e inequívoco.

Com o formato usado, você também inclui todas as linhas que têm a coluna definida como meia-noite de 1º de janeiro de 2000, mas não mais tarde nesse dia. Isso pode ser o que você quer, mas certifique-se de entender como BETWEEN funciona. Se você estiver realmente procurando por datas dentro dessa década, incluindo a qualquer momento em 31 de dezembro de 1999, você pode usar:
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'

Para carimbos de data/hora, você pode usar TO_TIMESTAMP() ou um literal de carimbo de data/hora:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'

Para carimbos de data/hora com fusos horários, você pode usar TO_TIMESTAMP_TZ () ou um literal de carimbo de data/hora, com uma região de fuso horário de nomes:
WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'