Tipos de dados de data e hora

O Snowflake oferece suporte a tipos de dados para gerenciar datas, horas e carimbos de data/hora (data e hora combinados). O Snowflake também oferece suporte a formatos para constantes de cadeia de caracteres usadas na manipulação de datas, horas e carimbos de data/hora.

Tipos de dados

O Snowflake oferece suporte aos seguintes tipos de dados de data e hora:

Nota

Para dados de DATE e TIMESTAMP, o Snowflake recomenda usar anos entre 1582 e 9999. O Snowflake oferece suporte a alguns anos fora deste intervalo, mas anos anteriores a 1582 devem ser evitados devido a limitações no calendário gregoriano.

DATE

O Snowflake oferece suporte a apenas um tipo de dados de DATE para armazenamento de datas (sem elementos de hora).

DATE aceita datas nas formas mais comuns (YYYY-MM-DD, DD-MON-YYYY e assim por diante).

Além disso, todos os valores TIMESTAMP aceitos são entradas válidas para datas, mas as informações de TIME são truncadas.

DATETIME

DATETIME é sinônimo de TIMESTAMP_NTZ.

Tipos de dados de intervalo

Os tipos de dados de intervalo armazenam valores que representam uma duração de tempo. Você pode calcular um intervalo como a diferença entre duas datas ou horários. Um intervalo define apenas uma duração, portanto, ele não tem um ponto inicial ou final no tempo. Por exemplo, você pode definir um intervalo como três anos e sete meses.

O Snowflake oferece suporte às seguintes variações de ano-mês de tipos de dados de intervalo:

Tipo de dados

Descrição

INTERVAL YEAR

Representa uma duração de tempo em anos.

INTERVAL YEAR TO MONTH

Representa uma duração de tempo em anos e meses.

INTERVAL MONTH

Representa uma duração de tempo em meses.

O Snowflake oferece suporte às seguintes variações de dia-hora de tipos de dados de intervalo:

Tipo de dados

Descrição

INTERVAL DAY

Representa uma duração de tempo em dias.

INTERVAL DAY TO HOUR

Representa uma duração de tempo em dias e horas.

INTERVAL DAY TO MINUTE

Representa uma duração de tempo em dias, horas e minutos.

INTERVAL DAY TO SECOND

Representa uma duração de tempo em dias, horas, minutos, segundos e segundos fracionários.

INTERVAL HOUR

Representa uma duração de tempo em horas.

INTERVAL HOUR TO MINUTE

Representa uma duração de tempo em horas e minutos.

INTERVAL HOUR TO SECOND

Representa uma duração de tempo em horas, minutos, segundos e segundos fracionários.

INTERVAL MINUTE

Representa uma duração de tempo em minutos.

INTERVAL MINUTE TO SECOND

Representa uma duração de tempo em minutos, segundos e segundos fracionários.

INTERVAL SECOND

Representa uma duração de tempo em segundos e segundos fracionários.

As seções a seguir descrevem em mais detalhes os tipos de dados de intervalo:

Nota

Você também pode usar constantes de intervalo para aritmética de data e hora. No entanto, as constantes de intervalo não oferecem suporte ao armazenamento de intervalo como tipo de coluna.

Benefícios dos tipos de dados de intervalo

Os tipos de dados de intervalo oferecem os seguintes benefícios:

  • Garantir a aritmética de datas precisas sem ambiguidade.

  • Eliminar a necessidade de conversão manual de durações baseadas em números inteiros.

  • Otimizar o armazenamento de dados que representam intervalos de tempo.

  • Otimizar a execução de consultas para dados de duração.

  • Simplificar a migração de dados de bancos de dados de terceiros, como Databricks, Oracle e Teradata.

  • Cumprir os padrões da ANSI.

Sintaxe dos tipos de dados de intervalo

Para especificar um tipo de dados de intervalo, use a seguinte sintaxe:

INTERVAL { yearMonthQualifier | dayTimeQualifier }

Onde:

yearMonthQualifier ::=
  {
    YEAR [ (<precision>) ] [ TO MONTH ]
    | MONTH [ (<precision>) ]
  }
dayTimeQualifier ::=
  {
    DAY [ (<precision>) ] [ TO { HOUR | MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | HOUR [ (<precision>) ] [ TO { MINUTE | SECOND [ (<fractional_seconds_precision>) ] } ]
    | MINUTE [ (<precision>) ] [ TO SECOND [ (<fractional_seconds_precision>) ] ]
    | SECOND [ (<precision>) [ , (<fractional_seconds_precision>) ] ]
  }

Propriedades:

  • precision é o número total de dígitos permitido. A precisão pode variar de 1 a 9.

    Padrão: 9

  • fractional_seconds_precision é o número de dígitos na parte fracionária de um segundo. A precisão de tempo pode variar de 0 (segundos) a 9 (nanossegundos).

    Padrão: 9

Use esta sintaxe quando especificar um tipo de dados de intervalo. Por exemplo, a seguinte tabela tem a coluna duration do tipo INTERVAL YEAR TO MONTH:

CREATE OR REPLACE TEMPORARY TABLE sample_table_with_interval (
  id VARCHAR,
  duration INTERVAL YEAR(2) TO MONTH);

Representando valores de intervalo

Você pode representar um valor de intervalo usando um literal ou formato de intervalo:

Literais de intervalo

Literal de intervalo é uma expressão que especifica uma duração de tempo em um literal de cadeia de caracteres. Use a seguinte sintaxe para especificar um literal de intervalo:

INTERVAL '[ <sign> ] <string>' { <yearMonthQualifier> | <dayTimeQualifier> }

Onde:

Formatos de intervalo

Literais de cadeia de caracteres em formatos específicos podem representar valores de intervalo.

Para especificar valores de anos e meses, use o seguinte formato:

'<sign><Y>-<MM>'

Onde:

  • sign é um símbolo obrigatório que especifica uma duração de tempo positiva (+) ou negativa (-).

    Padrão: +.

  • Y é o número de anos. O número de dígitos permitido (precisão) depende do tipo de dados do valor.

  • MM representa os dois dígitos para o número de meses, de 00 a 11.

Para especificar valores de dias, horas, segundos e segundos fracionários, use o seguinte formato:

'<sign>[<D>] [<HH24>]:[<MI>]:[<SS>].[<F>]'

Onde:

  • sign é um símbolo obrigatório que especifica uma duração de tempo positiva (+) ou negativa (-).

    Padrão: +.

  • D é o número de dias. O número de dígitos permitido (precisão) depende do tipo de dados do valor.

    Omita D para valores dos seguintes tipos:

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL HOUR TO SECOND

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • HH24 representa os dois dígitos para o número de horas, de 00 a 23.

    Omita HH24 para valores dos seguintes tipos:

    • INTERVAL DAY

    • INTERVAL MINUTE

    • INTERVAL MINUTE TO SECOND

    • INTERVAL SECOND

  • MI representa os dois dígitos para o número de minutos, de 00 a 59.

    Omita MI para valores dos seguintes tipos:

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY

    • INTERVAL HOUR

    • INTERVAL SECOND

  • SS representa os dois dígitos para o número de segundos, de 00 a 59.

    Omita SS para valores dos seguintes tipos:

    • INTERVAL DAY

    • INTERVAL DAY TO HOUR

    • INTERVAL DAY TO MINUTE

    • INTERVAL HOUR

    • INTERVAL HOUR TO MINUTE

    • INTERVAL MINUTE

  • F é o número de segundos fracionários para os tipos de dados que incluem segundos. O número de dígitos permitido (precisão) depende do tipo de dados do valor.

As seguintes notas de uso se aplicam a literais de cadeia de caracteres no formato de intervalo:

  • A representação do literal de cadeia de caracteres se aplica quando você usa a função CAST ou TO_CHAR para converter intervalos explicitamente em cadeias de caracteres de texto.

  • Zeros iniciais em um campo especificam a precisão.

Exemplos de valores de intervalo

A tabela a seguir mostra como representar vários valores de intervalo. Os valores mostrados na tabela estão em conformidade com as seguintes regras para valores de intervalo:

  • Para valores positivos, o sinal de mais + é opcional para valores de literal de intervalo, mas obrigatório para valores de formato de intervalo.

  • Nos valores de literal de intervalo, o valor entre parênteses especifica a precisão, que é o número de dígitos permitido. Por exemplo, YEAR(3) especifica que três dígitos são permitidos no ano.

  • Nos valores de formato de intervalo, o campo primário (campo inicial) não inclui zeros iniciais. Os campos subordinados utilizam um número fixo de dígitos. Por exemplo, em um valor YEAR TO MONTH, como +1-08, o campo do ano não tem zeros iniciais e o campo do mês usa dois dígitos.

Duração

Tipo

Valor de literal de intervalo

Valor de formato de intervalo

5 anos positivos

INTERVAL YEAR

INTERVAL '5' YEAR(2)

'+5'

1 ano e 8 meses positivo

INTERVAL YEAR TO MONTH

INTERVAL '1-08' YEAR(3) TO MONTH

'+001-08'

5 meses negativos

INTERVAL MONTH

INTERVAL '-5' MONTH(2)

'-5'

14 meses positivos

INTERVAL MONTH

INTERVAL '14' MONTH(2)

'+14'

44 anos e 11 meses negativos

INTERVAL YEAR TO MONTH

INTERVAL '-44-11' YEAR(2) TO MONTH

'-44-11'

11 dias, 10 horas e 9 minutos positivos

INTERVAL DAY TO MINUTE

INTERVAL '11 10:09' DAY(2) TO MINUTE

'+11 10:09'

2 dias, 23 horas, 8 minutos, 23 segundos e 275 milissegundos positivos

INTERVAL DAY TO SECOND

INTERVAL '02 23:08:23.275' DAY(2) TO SECOND(3)

'+2 23:08:23.275'

4 segundos e 300 milissegundos positivos

INTERVAL SECOND

INTERVAL '4.3' SECOND(5, 6)

'+4.300000'

Operações que envolvem valores de data e hora

A tabela a seguir mostra o tipo de dados do resultado para operações aritméticas válidas que envolvem valores de intervalo:

Primeiro operando

Operador

Segundo operando

Tipo de resultado

Carimbo de data/hora

-

Carimbo de data/hora

Um tipo de dados de intervalo

Data ou carimbo de data/hora

+

Intervalo

DATE DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ ou TIMESTAMP_TZ

Data ou carimbo de data/hora

-

Intervalo

DATE DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ ou TIMESTAMP_TZ

Intervalo

+

Data ou carimbo de data/hora

DATE DATETIME, TIMESTAMP_LTZ, TIMESTAMP_NTZ ou TIMESTAMP_TZ

Numérico

*

Intervalo

Um tipo de dados de intervalo

Intervalo

*

Numérico

Um tipo de dados de intervalo

Intervalo

/

Numérico

Um tipo de dados de intervalo

Intervalo

+

Intervalo

Um tipo de dados de intervalo

Intervalo

-

Intervalo

Um tipo de dados de intervalo

Para operações que envolvem dois valores de intervalo, eles devem ser valores de intervalo de ano-mês ou de dia-hora. Não há suporte para operações que misturam valores de intervalo de ano-mês e de dia-hora. Quando a operação envolve dois valores de intervalo de ano-mês, o tipo de resultado é um intervalo de ano-mês. Quando a operação envolve dois valores de intervalo de dia-hora, o tipo de resultado é de intervalo de dia-hora.

Funções que aceitam valores de intervalo como argumentos

As seguintes funções aceitam valores de intervalo como argumentos:

Exemplos de tipos de dados de intervalo

Os seguintes exemplos mostram como usar tipos de dados de intervalo:

Operando aritmética com dados de intervalo

Os exemplos a seguir operam aritmética com dados de intervalo.

Adicionar um ano e um mês a uma data:

SELECT TO_DATE('2024-01-01') + INTERVAL '1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2025-02-01                   |
+------------------------------+

Subtrair um ano e um mês de uma data:

SELECT TO_DATE('2024-01-01') + INTERVAL '-1-1' YEAR TO MONTH
  AS date_plus_one_year_one_month;
+------------------------------+
| DATE_PLUS_ONE_YEAR_ONE_MONTH |
|------------------------------|
| 2022-12-01                   |
+------------------------------+

Adicionar um período de tempo a um carimbo de data/hora:

SELECT TO_TIMESTAMP('2024-01-01 08:08:08.99') + INTERVAL '1 01:01:01.7878' DAY TO SECOND
  AS date_plus_period_of_time;
+--------------------------+
| DATE_PLUS_PERIOD_OF_TIME |
|--------------------------|
| 2024-01-02 09:09:10.777  |
+--------------------------+

O seguinte exemplo usa a função SYSTEM$TYPEOF para mostrar que um valor INTERVAL DAY TO SECOND é retornado quando uma consulta subtrai dois valores de carimbo de data/hora:

SELECT SYSTEM$TYPEOF(TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))
  AS type;
+------------------------------------+
| TYPE                               |
|------------------------------------|
| INTERVAL DAY(9) TO SECOND(9)[SB16] |
+------------------------------------+

Para visualizar os resultados da consulta no formato de intervalo, você pode converter a expressão no tipo de dados INTERVAL DAY(2) TO SECOND(2) para especificar a precisão e, depois, converter em VARCHAR:

SELECT (TO_TIMESTAMP('2025-10-05 01:02:03') - TO_TIMESTAMP('2025-09-15 11:36:22'))::INTERVAL DAY(2) TO SECOND(2)::VARCHAR
  AS interval_format_result;
+------------------------+
| INTERVAL_FORMAT_RESULT |
|------------------------|
| +19 13:25:41.00        |
+------------------------+
Inserindo e consultando dados de intervalo de ano-mês

Crie uma tabela que rastreie os candidatos às posições abertas com uma coluna INTERVAL YEAR TO MONTH e insira os dados:

CREATE OR REPLACE TABLE candidates (
  name_first VARCHAR,
  name_last VARCHAR,
  duration_of_experience INTERVAL YEAR(2) TO MONTH);

INSERT INTO candidates VALUES ('Jane', 'Smith', '14-4');
INSERT INTO candidates VALUES ('Robert', 'Adams', '0-3');
INSERT INTO candidates VALUES ('Mary', 'Jones', '5-11');

Quando você consulta a tabela sem converter a coluna duration_of_experience` em um tipo de dados, a saída mostra os valores da coluna como o número total de meses em cada linha:

SELECT name_first,
       name_last,
       duration_of_experience AS months_of_experience
  FROM candidates;
+------------+-----------+----------------------+
| NAME_FIRST | NAME_LAST | MONTHS_OF_EXPERIENCE |
|------------+-----------+----------------------|
| Jane       | Smith     |                  172 |
| Robert     | Adams     |                    3 |
| Mary       | Jones     |                   71 |
+------------+-----------+----------------------+

Quando você consulta a tabela e converte a coluna duration_of_experience no tipo de dados VARCHAR, a saída mostra os valores da coluna no formato de intervalo:

SELECT name_first,
       name_last,
       duration_of_experience::VARCHAR AS duration_of_experience
  FROM candidates;
+------------+-----------+------------------------+
| NAME_FIRST | NAME_LAST | DURATION_OF_EXPERIENCE |
|------------+-----------+------------------------|
| Jane       | Smith     | +14-04                 |
| Robert     | Adams     | +0-03                  |
| Mary       | Jones     | +5-11                  |
+------------+-----------+------------------------+
Inserindo e consultando dados de intervalo de dia-hora

Crie uma tabela que especifique a duração do tempo limite para vários recursos de software com uma coluna INTERVAL HOUR TO SECOND e insira os dados:

CREATE OR REPLACE TABLE feature_timeouts (
  feature VARCHAR,
  timeout_duration INTERVAL HOUR(2) TO SECOND(0));

INSERT INTO feature_timeouts VALUES ('Feature1', '00:00:30');
INSERT INTO feature_timeouts VALUES ('Feature2', '00:10:00');
INSERT INTO feature_timeouts VALUES ('Feature3', '01:00:00');

Consulte a tabela e converta a coluna timeout_duration no tipo de dados VARCHAR:

SELECT feature,
       timeout_duration::VARCHAR AS timeout_duration
  FROM feature_timeouts;
+----------+------------------+
| FEATURE  | TIMEOUT_DURATION |
|----------+------------------|
| Feature1 | +0:00:30         |
| Feature2 | +0:10:00         |
| Feature3 | +1:00:00         |
+----------+------------------+
Copiando dados de intervalo em uma tabela e consultando a tabela

Conclua as etapas a seguir para preparar um arquivo com dados de intervalo e, em seguida, copie o arquivo em uma tabela:

  1. Em um arquivo em seu sistema de arquivos, copie o seguinte conteúdo:

    1,1-2,28 16:15:14.0
    2,-3-2,-54 16:15:14.123
    

    Este exemplo assume que o nome do arquivo é interval_values.csv no diretório /examples/intervals/.

  2. Crie uma área de preparação:

    CREATE STAGE interval_stage;
    
  3. No local da área de preparação interna, prepare o arquivo:

    PUT file:///examples/intervals/interval_values.csv @~/interval_stage
      AUTO_COMPRESS=false;
    
  4. Crie uma tabela para os dados:

    CREATE OR REPLACE TABLE sample_interval_values(
      c1 STRING,
      c2 INTERVAL YEAR(1) TO MONTH,
      c3 INTERVAL DAY(2) TO SECOND(3));
    
  5. Para carregar o arquivo preparado na tabela que você criou, use o comando COPY INTO <tabela>:

    COPY INTO sample_interval_values FROM @~/interval_stage;
    
  6. Para visualizar os dados carregados, consulte a tabela e converta no tipo VARCHAR:

    SELECT c1,
           c2::VARCHAR AS YEAR_TO_MONTH,
           c3::VARCHAR AS DAY_TO_SECOND,
      FROM sample_interval_values;
    
    +----+---------------+------------------+
    | C1 | YEAR_TO_MONTH | DAY_TO_SECOND    |
    |----+---------------+------------------|
    | 1  | +1-02         | +28 16:15:14.000 |
    | 2  | -3-02         | -54 16:15:14.123 |
    +----+---------------+------------------+
    

Limitações para tipos de dados de intervalo

As seguintes limitações se aplicam aos tipos de dados de intervalo:

TIME

O Snowflake oferece suporte a apenas um tipo de dados de TIME para armazenamento de hora no formato de HH:MI:SS.

TIME oferece suporte a um parâmetro de precisão opcional para segundos fracionários (por exemplo, TIME(3)). A precisão do tempo pode variar de 0 (segundos) a 9 (nanossegundos). A precisão padrão é 9.

Todos os valores de TIME devem estar entre 00:00:00 e 23:59:59.999999999. TIME armazena internamente a hora do “relógio de parede”, e todas as operações com valores de TIME são realizadas sem levar em consideração o fuso horário.

TIMESTAMP_LTZ , TIMESTAMP_NTZ , TIMESTAMP_TZ

O Snowflake oferece suporte a três variações de carimbo de data/hora:

TIMESTAMP_LTZ:

TIMESTAMP_LTZ armazena internamente os valores UTC com uma precisão especificada. Entretanto, todas as operações são realizadas no fuso horário da sessão atual, controlado pelo parâmetro de sessão TIMEZONE.

Sinônimo de TIMESTAMP_LTZ:

  • TIMESTAMPLTZ

  • TIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP_NTZ:

TIMESTAMP_NTZ armazena internamente a hora do “relógio de parede” com uma precisão especificada. Todas as operações são realizadas sem considerar o fuso horário.

Se o formato de saída contiver um fuso horário, o indicador de UTC (Z) é exibido.

TIMESTAMP_NTZ é o padrão para TIMESTAMP.

Sinônimo de TIMESTAMP_NTZ:

  • TIMESTAMPNTZ

  • TIMESTAMP WITHOUT TIME ZONE

  • DATETIME

TIMESTAMP_TZ:

TIMESTAMP_TZ armazena internamente os valores UTC juntamente com um deslocamento de fuso horário associado. Quando um fuso horário não é fornecido, é usado o deslocamento de fuso horário da sessão. Todas as operações são realizadas com o deslocamento de fuso horário específico para cada registro.

Sinônimo de TIMESTAMP_TZ:

  • TIMESTAMPTZ

  • TIMESTAMP WITH TIME ZONE

Os valores de TIMESTAMP_TZ são comparados com base em suas horas em UTC. Por exemplo, a seguinte comparação entre diferentes horas em diferentes fusos horários retorna TRUE porque os dois valores têm horas equivalentes em UTC.

SELECT '2024-01-01 00:00:00 +0000'::TIMESTAMP_TZ = '2024-01-01 01:00:00 +0100'::TIMESTAMP_TZ;

Atenção

Atualmente, TIMESTAMP_TZ armazena apenas o deslocamento de um determinado fuso horário, não o fuso horário real, no momento da criação para um determinado valor. Isto é especialmente importante para o horário de verão, que não é utilizado pelo UTC.

Por exemplo, com o parâmetro TIMEZONE definido como "America/Los_Angeles", a conversão de um valor para TIMESTAMP_TZ em janeiro de um determinado ano armazena o deslocamento de fuso horário de -0800. Se seis meses depois forem adicionados ao valor, o deslocamento -0800 será mantido, mesmo que em julho o deslocamento para Los Angeles seja -0700. Isto porque, depois que o valor é criado, a informação do fuso horário real ("America/Los_Angeles") não está mais disponível. A seguinte amostra de código ilustra esse comportamento:

SELECT '2024-01-01 12:00:00'::TIMESTAMP_TZ;
+-------------------------------------+
| '2024-01-01 12:00:00'::TIMESTAMP_TZ |
|-------------------------------------|
| 2024-01-01 12:00:00.000 -0800       |
+-------------------------------------+
SELECT DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ);
+--------------------------------------------------------+
| DATEADD(MONTH, 6, '2024-01-01 12:00:00'::TIMESTAMP_TZ) |
|--------------------------------------------------------|
| 2024-07-01 12:00:00.000 -0800                          |
+--------------------------------------------------------+

TIMESTAMP

TIMESTAMP no Snowflake é um alias especificado pelo usuário associado a uma das variações de TIMESTAMP_*. Em todas as operações em que TIMESTAMP é usado, a variação associada de TIMESTAMP_* é automaticamente usada. O tipo de dados de TIMESTAMP nunca é armazenado em tabelas.

A variação de TIMESTAMP_* associada ao TIMESTAMP é especificada pelo parâmetro de sessão TIMESTAMP_TYPE_MAPPING. O padrão é TIMESTAMP_NTZ.

Todas as variações de carimbo de data/hora, bem como o alias TIMESTAMP, oferecem suporte a um parâmetro de precisão opcional para segundos fracionários (por exemplo, TIMESTAMP(3)). A precisão do carimbo de data/hora pode variar de 0 (segundos) a 9 (nanossegundos). A precisão padrão é 9.

Exemplos de carimbo de data/hora

Esses exemplos criam uma tabela usando diferentes carimbos de data/hora.

Primeiro, crie uma tabela com uma coluna TIMESTAMP (mapeada para TIMESTAMP_NTZ):

ALTER SESSION SET TIMESTAMP_TYPE_MAPPING = TIMESTAMP_NTZ;

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_NTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Em seguida, use explicitamente uma das variações TIMESTAMP (TIMESTAMP_LTZ):

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

DESC TABLE ts_test;
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+
| name | type             | kind   | null? | default | primary key | unique key | check | expression | comment | policy name | privacy domain |
|------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------|
| TS   | TIMESTAMP_LTZ(9) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        | NULL           |
+------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+----------------+

Usar TIMESTAMP_LTZ com fusos horários diferentes:

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_LTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Esta consulta mostra que o horário para 2 de janeiro é 08:00 em Los Angeles (que é 16:00 em UTC):

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 08:00:00.000 -0800 |        8 |
+-------------------------------+----------+

Em seguida, observe que os horários mudam com um fuso horário diferente:

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 19:00:00.000 -0500 |       19 |
| 2024-01-02 11:00:00.000 -0500 |       11 |
+-------------------------------+----------+

Crie uma tabela e use TIMESTAMP_NTZ:

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_NTZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Observe que ambos os horários de fusos horários diferentes são convertidos para a mesma hora local:

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

Em seguida, observe que alterar o fuso horário da sessão não afeta os resultados:

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------+----------+
| TS                      | HOUR(TS) |
|-------------------------+----------|
| 2024-01-01 16:00:00.000 |       16 |
| 2024-01-02 16:00:00.000 |       16 |
+-------------------------+----------+

Crie uma tabela e use TIMESTAMP_TZ:

CREATE OR REPLACE TABLE ts_test(ts TIMESTAMP_TZ);

ALTER SESSION SET TIMEZONE = 'America/Los_Angeles';

INSERT INTO ts_test VALUES('2024-01-01 16:00:00');
INSERT INTO ts_test VALUES('2024-01-02 16:00:00 +00:00');

Observe que o registro de 1º de janeiro herdou o fuso horário da sessão e America/Los_Angeles foi convertido em um deslocamento numérico de fuso horário:

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

Em seguida, observe que alterar o fuso horário da sessão não afeta os resultados:

ALTER SESSION SET TIMEZONE = 'America/New_York';

SELECT ts, HOUR(ts) FROM ts_test;
+-------------------------------+----------+
| TS                            | HOUR(TS) |
|-------------------------------+----------|
| 2024-01-01 16:00:00.000 -0800 |       16 |
| 2024-01-02 16:00:00.000 +0000 |       16 |
+-------------------------------+----------+

Calendário com suporte

O Snowflake usa o calendário gregoriano para todas as datas e carimbos de data/hora. O calendário gregoriano começa no ano 1582, mas reconhece os anos anteriores, o que é importante observar porque o Snowflake não ajusta datas anteriores a 1582 (ou faz cálculos envolvendo datas anteriores a 1582) para corresponder ao calendário juliano. O elemento de formato UUUU oferece suporte a anos negativos.

Formatos de data e hora

Todos esses tipos de dados aceitam a maioria dos formatos não ambíguos de data, hora ou data e hora. Consulte Formatos com suporte para detecção AUTO para ver os formatos que o Snowflake reconhece quando configurado para detectar o formato automaticamente.

Você também pode especificar o formato de data e hora manualmente. Ao especificar o formato, você pode usar os elementos que não diferenciam maiúsculas e minúsculas listados na tabela a seguir:

Elemento de formato

Descrição

YYYY

Ano de quatro dígitos [1].

YY

Ano de dois dígitos [1], controlado pelo parâmetro de sessão TWO_DIGIT_CENTURY_START. Por exemplo, quando definido como 1980, os valores de 79 e 80 são analisados ​ como 2079 e 1980, respectivamente.

Y

Ano de um ou dois dígitos [2] sem zeros iniciais, controlado pelo parâmetro de sessão TWO_DIGIT_CENTURY_START. Por exemplo, quando o parâmetro é definido como 1990, os valores de 2005 e 1991 são serializados como 5 e 91, respectivamente.

MM

Mês de dois dígitos [1] (01 = janeiro e assim por diante).

MO

Mês de um ou dois dígitos [2] sem zeros iniciais (1 = janeiro e assim por diante).

MON

Nome abreviado do mês: sup:[3].

MMMM

Nome completo do mês: sup:[3].

DD

Dia do mês de dois dígitos [1] (01 a 31).

D

Dia do mês de um ou dois dígitos [2] sem zeros iniciais (1 a 31).

DY

Dia da semana abreviado.

HH24

Dois dígitos [1] para hora (00 a 23). Você não deve especificar AM/PM ou A/P.

HH12

Dois dígitos [1] para hora (01 a 12). Você pode especificar AM/PM ou A/P.

H24

Um ou dois dígitos [2] para hora sem zeros iniciais (0 a 23). Você não deve especificar AM/PM ou A/P.

H12

Um ou dois dígitos [2] para hora sem zeros iniciais (1 a 12). Você pode especificar AM/PM ou A/P.

AM , PM

Antes do meio-dia (AM) / depois do meio-dia (PM). Use-o somente com HH12 e code:H12 (não com HH24 ou H24).

P

Antes do meio-dia (A) / depois do meio-dia (P). Use-o somente com HH12 e code:H12 (não com HH24 ou H24).

HH

Sinônimo de HH24.

H

Sinônimo de H24.

MI

Dois dígitos [1] para minuto (00 a 59).

ME

Um ou dois dígitos [2] para minuto sem zeros iniciais (0 a 59).

SS

Dois dígitos [1] para segundo (00 a 59).

S

Um ou dois dígitos [2] para segundo sem zeros iniciais (0 a 59).

FF[0-9]

Segundos fracionários com precisão de 0 (segundos) para 9 (nanossegundos), por exemplo FF, FF0, FF3, FF9. Especificando que FF é equivalente a FF9 (nanossegundos).

TZH:TZM , TZHTZM , TZH

Hora e minuto do fuso horário [1] de dois dígitos, ajustados em relação ao UTC. Pode ser prefixado por + / - para sinalizar.

UUUU

Ano de quatro dígitos no formato ISO, que são negativos para anos BCE.

[1] O número de dígitos descreve a saída produzida ao serializar valores em texto. Ao analisar texto, o Snowflake aceita até o número especificado de dígitos. Por exemplo, o número de um dia pode ter um ou dois dígitos.

[2] O número de dígitos descreve a saída produzida ao serializar valores em texto. Não há suporte para análise. Se a análise for necessária, use um formato equivalente que inclua zeros iniciais. Estes elementos de formato serão habilitados no pacote BCR 2026_03.

[3] Para o elemento de formato MON, a saída retornou quando a serialização de valores em texto é o nome abreviado do mês. Para o elemento de formato MMMM, a saída retornou quando a serialização de valores em texto é o nome completo do mês. Ao analisar o texto, o Snowflake aceita a abreviação de três dígitos ou o nome completo do mês para ambos MON e MMMM. Por exemplo, «janeiro» ou «jan», «fevereiro» ou «fev», e assim por diante, são aceitos na análise de texto.

Nota

  • Quando se utiliza um formato somente de data, presume-se que a hora associada seja a meia-noite desse dia.

  • Qualquer elemento no formato entre aspas duplas ou elementos diferentes dos elementos acima é analisado/formatado sem ser interpretado. A Snowflake sempre recomenda incluir caracteres de literal entre aspas duplas (por exemplo, "T", "EST", "Z") para garantir que sejam tratados como literais.

  • Para obter mais detalhes sobre intervalos válidos, número de dígitos e práticas recomendadas, consulte Informações adicionais sobre o uso de formatos de data, hora e carimbo de data/hora.

Exemplos de uso de formatos de data e hora

O exemplo a seguir usa FF para indicar que a saída tem 9 dígitos no campo de segundos fracionários:

CREATE OR REPLACE TABLE timestamp_demo_table(
  tstmp TIMESTAMP,
  tstmp_tz TIMESTAMP_TZ,
  tstmp_ntz TIMESTAMP_NTZ,
  tstmp_ltz TIMESTAMP_LTZ);
INSERT INTO timestamp_demo_table (tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz) VALUES (
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789',
  '2024-03-12 01:02:03.123456789');
ALTER SESSION SET TIMESTAMP_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_TZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_NTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
ALTER SESSION SET TIMESTAMP_LTZ_OUTPUT_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
SELECT tstmp, tstmp_tz, tstmp_ntz, tstmp_ltz
  FROM timestamp_demo_table;
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+
| TSTMP                         | TSTMP_TZ                      | TSTMP_NTZ                     | TSTMP_LTZ                     |
|-------------------------------+-------------------------------+-------------------------------+-------------------------------|
| 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 | 2024-03-12 01:02:03.123456789 |
+-------------------------------+-------------------------------+-------------------------------+-------------------------------+

Constantes de data e hora

Constantes (também conhecidas como literais) são valores de dados fixos. O Snowflake oferece suporte ao uso de constantes de cadeias de caracteres para especificar valores fixos de data, hora ou carimbo de data/hora. As constantes de cadeias de caracteres devem estar sempre posicionadas entre caracteres delimitadores. O Snowflake oferece suporte ao uso de aspas simples para delimitar as constantes de cadeias de caracteres.

Por exemplo:

DATE '2024-08-14'
TIME '10:03:56'
TIMESTAMP '2024-08-15 10:59:43'

A cadeia de caracteres é interpretada como um valor DATE, TIME ou TIMESTAMP com base no formato de entrada para o tipo de dados, conforme definido pelos seguintes parâmetros:

DATE:

DATE_INPUT_FORMAT

TIME:

TIME_INPUT_FORMAT

TIMESTAMP:

TIMESTAMP_INPUT_FORMAT

Por exemplo, para inserir uma data específica em uma coluna em uma tabela:

CREATE TABLE t1 (d1 DATE);

INSERT INTO t1 (d1) VALUES (DATE '2024-08-15');

Constantes de intervalo

É possível usar constantes de intervalo para adicionar ou subtrair um período de tempo para ou de uma data, horário ou carimbo de data/hora. As constantes de intervalo são implementadas usando a palavra-chave INTERVAL, que tem a seguinte sintaxe:

{ + | - } INTERVAL '<integer> [ <date_time_part> ] [ , <integer> [ <date_time_part> ] ... ]'

Como em todas as constantes de cadeias de caracteres, o Snowflake exige aspas simples para delimitar as constantes de intervalo.

Nota

As constantes de intervalo são compatíveis com aritmética de data e hora, mas não são compatíveis com armazenamento de intervalo como tipo de coluna. Para armazenar valores de intervalo em uma coluna, você pode usar tipos de dados de intervalo.

A palavra-chave INTERVAL permite um ou mais números inteiros e, opcionalmente, uma ou mais partes de data ou hora. Por exemplo:

  • INTERVAL '1 year' representa um ano.

  • INTERVAL '4 years, 5 months, 3 hours' representa quatro anos, cinco meses e três horas.

Se uma parte da data ou hora não for especificada, o intervalo representa segundos (por exemplo, INTERVAL '2' é o mesmo que INTERVAL '2 seconds'). Note que isto é diferente da unidade de tempo padrão para realizar a aritmética de datas. Para obter mais detalhes, consulte Aritmética simples para datas.

Para obter a lista de partes de data e hora compatíveis, consulte Partes de data e hora compatíveis com intervalos.

Nota

  • A ordem dos incrementos de intervalo é importante. Os incrementos são adicionados ou subtraídos na ordem listada. Por exemplo:

    • INTERVAL '1 year, 1 day' primeiro adiciona ou subtrai um ano e depois um dia.

    • INTERVAL '1 day, 1 year' primeiro adiciona ou subtrai um dia e depois um ano.

    Diferenças de ordenação podem afetar cálculos influenciados por eventos do calendário, como anos bissextos:

    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 day, 1 year';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 DAY, 1 YEAR' |
    |---------------------------------------------------|
    | 2020-03-01                                        |
    +---------------------------------------------------+
    
    SELECT TO_DATE ('2019-02-28') + INTERVAL '1 year, 1 day';
    
    +---------------------------------------------------+
    | TO_DATE ('2019-02-28') + INTERVAL '1 YEAR, 1 DAY' |
    |---------------------------------------------------|
    | 2020-02-29                                        |
    +---------------------------------------------------+
    
  • INTERVAL não é um tipo de dados (ou seja, não é possível definir uma coluna de tabela como sendo do tipo de dados INTERVAL). Os intervalos só podem ser usados em aritmética de data, hora e carimbo de data/hora.

  • Você não pode usar um intervalo com uma variável SQL. Por exemplo, a consulta a seguir retorna um erro:

    SET v1 = '1 year';
    
    SELECT TO_DATE('2023-04-15') + INTERVAL $v1;
    

Partes de data e hora com suporte para intervalos

A palavra-chave INTERVAL permite as seguintes partes de data e hora como argumentos (sem diferenciação de maiúsculas e minúsculas):

Parte de data ou hora

Abreviações/variações

year

y , yy , yyy , yyyy , yr , years , yrs

quarter

q , qtr , qtrs , quarters

month

mm , mon , mons , months

week

w , wk , weekofyear , woy , wy , weeks

day

d , dd , days, dayofmonth

hour

h , hh , hr , hours , hrs

minute

m , mi , min , minutes , mins

second

s , sec , seconds , secs

millisecond

ms , msec , milliseconds

microsecond

us , usec , microseconds

nanosecond

ns , nsec , nanosec , nsecond , nanoseconds , nanosecs , nseconds

Exemplos de intervalos

Adicionar um intervalo de um ano a uma data específica:

SELECT TO_DATE('2023-04-15') + INTERVAL '1 year';
+-------------------------------------------+
| TO_DATE('2023-04-15') + INTERVAL '1 YEAR' |
|-------------------------------------------|
| 2024-04-15                                |
+-------------------------------------------+

Adicione um intervalo de 3 horas e 18 minutos a um horário específico:

SELECT TO_TIME('04:15:29') + INTERVAL '3 hours, 18 minutes';
+------------------------------------------------------+
| TO_TIME('04:15:29') + INTERVAL '3 HOURS, 18 MINUTES' |
|------------------------------------------------------|
| 07:33:29                                             |
+------------------------------------------------------+

Adicionar um intervalo complexo à saída da função CURRENT_TIMESTAMP:

SELECT CURRENT_TIMESTAMP + INTERVAL
    '1 year, 3 quarters, 4 months, 5 weeks, 6 days, 7 minutes, 8 seconds,
    1000 milliseconds, 4000000 microseconds, 5000000001 nanoseconds'
  AS complex_interval1;

A seguir, um exemplo de saída. A saída é diferente quando o carimbo de data/hora atual é diferente.

+-------------------------------+
| COMPLEX_INTERVAL1             |
|-------------------------------|
| 2026-11-07 18:07:19.875000001 |
+-------------------------------+

Adicionar um intervalo complexo com notação abreviada de parte de data/hora a uma data específica:

SELECT TO_DATE('2025-01-17') + INTERVAL
    '1 y, 3 q, 4 mm, 5 w, 6 d, 7 h, 9 m, 8 s,
    1000 ms, 445343232 us, 898498273498 ns'
  AS complex_interval2;
+-------------------------------+
| COMPLEX_INTERVAL2             |
|-------------------------------|
| 2027-03-30 07:31:32.841505498 |
+-------------------------------+

Consulte uma tabela de informações de funcionários e retorne os nomes dos funcionários contratados nos últimos dois anos e três meses:

SELECT name, hire_date
  FROM employees
  WHERE hire_date > CURRENT_DATE - INTERVAL '2 y, 3 month';

Filtre uma coluna TIMESTAMP nomeada ts de uma tabela nomeada t1 e adicione quatro segundos a cada valor retornado:

SELECT ts + INTERVAL '4 seconds'
  FROM t1
  WHERE ts > TO_TIMESTAMP('2024-04-05 01:02:03');

Aritmética simples para datas

Além de usar constantes de intervalo para adicionar e subtrair datas, horas e carimbos de data/hora, você também pode adicionar dias a e subtrair dias de valores DATE, na forma de { + | - } integer, em que integer especifica o número de dias a serem adicionados ou subtraídos.

Nota

Os valores TIME e TIMESTAMP ainda não oferecem suporte à aritmética simples.

Exemplos de aritmética de datas

Adicione um dia a uma data específica:

SELECT TO_DATE('2024-04-15') + 1;
+---------------------------+
| TO_DATE('2024-04-15') + 1 |
|---------------------------|
| 2024-04-16                |
+---------------------------+

Subtraia quatro dias de uma data específica:

SELECT TO_DATE('2024-04-15') - 4;
+---------------------------+
| TO_DATE('2024-04-15') - 4 |
|---------------------------|
| 2024-04-11                |
+---------------------------+

Consultar uma tabela chamada employees e retornar os nomes das pessoas que deixaram a empresa, mas foram empregadas por mais de 365 dias:

SELECT name
  FROM employees
  WHERE end_date > start_date + 365;