> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8a08bda2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Documentação sobre o tipo de dado DateTime no ClickHouse, que armazena timestamps com precisão de segundos

# DateTime

Permite armazenar um instante no tempo, que pode ser expresso como uma data de calendário e uma hora do dia.

Sintaxe:

```sql theme={null}
DateTime([timezone])
```

Faixa de valores suportada: \[1970-01-01 00:00:00, 2106-02-07 06:28:15].

Resolução: 1 segundo.

<div id="speed">
  ## Velocidade
</div>

O tipo de dados `Date` é mais rápido que `DateTime` na *maioria* dos casos.

O tipo `Date` requer 2 bytes de armazenamento, enquanto `DateTime` requer 4. No entanto, durante a compressão, a diferença de tamanho entre `Date` e `DateTime` se torna mais significativa. Isso ocorre porque os minutos e segundos em `DateTime` são menos compressíveis. Filtrar e agregar `Date` em vez de `DateTime` também é mais rápido.

<div id="usage-remarks">
  ## Observações de uso
</div>

O instante no tempo é salvo como um [Unix timestamp](https://en.wikipedia.org/wiki/Unix_time), independentemente do fuso horário ou do horário de verão. O fuso horário afeta como os valores do tipo `DateTime` são exibidos em formato de texto e como os valores especificados como strings são interpretados (`'2020-01-01 05:00:01'`).

Um Unix timestamp independente de fuso horário é armazenado nas tabelas, e o fuso horário é usado para convertê-lo para o formato de texto ou de volta durante a importação/exportação de dados, ou para fazer cálculos de calendário com os valores (exemplo: funções `toDate`, `toHour` etc.). O fuso horário não é armazenado nas linhas da tabela (nem no conjunto de resultados), mas nos metadados da coluna.

Uma lista dos fusos horários compatíveis pode ser encontrada no [IANA Time Zone Database](https://www.iana.org/time-zones) e também pode ser consultada com `SELECT * FROM system.time_zones`. [A lista](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) também está disponível na Wikipedia.

Você pode definir explicitamente um fuso horário para colunas do tipo `DateTime` ao criar uma tabela. Exemplo: `DateTime('UTC')`. Se o fuso horário não for definido, o ClickHouse usa o valor do parâmetro [timezone](/pt-BR/reference/settings/server-settings/settings#timezone) nas configurações do servidor ou nas configurações do sistema operacional no momento da inicialização do ClickHouse server.

O [clickhouse-client](/pt-BR/concepts/features/interfaces/client) aplica o fuso horário do servidor por padrão se um fuso horário não for explicitamente definido ao inicializar o tipo de dado. Para usar o fuso horário do cliente, execute `clickhouse-client` com o parâmetro `--use_client_time_zone`.

O ClickHouse gera valores de acordo com o valor da configuração [date\_time\_output\_format](/pt-BR/reference/settings/formats#date_time_output_format). O formato de texto `YYYY-MM-DD hh:mm:ss` é usado por padrão. Além disso, você pode alterar a saída com a função [formatDateTime](/pt-BR/reference/functions/regular-functions/date-time-functions#formatDateTime).

Ao inserir dados no ClickHouse, você pode usar diferentes formatos de strings de data e hora, dependendo do valor da configuração [date\_time\_input\_format](/pt-BR/reference/settings/formats#date_time_input_format).

<div id="examples">
  ## Exemplos
</div>

**1.** Criando uma tabela com uma coluna do tipo `DateTime` e inserindo dados nela:

```sql theme={null}
CREATE TABLE dt
(
    `timestamp` DateTime('Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = TinyLog;
```

```sql theme={null}
-- Converter DateTime
-- - a partir de string,
-- - a partir de inteiro interpretado como número de segundos desde 1970-01-01.
INSERT INTO dt VALUES ('2019-01-01 00:00:00', 1), (1546300800, 2);

SELECT * FROM dt;
```

```text theme={null}
┌───────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00 │        1 │
│ 2019-01-01 03:00:00 │        2 │
└─────────────────────┴──────────┘
```

* Ao inserir um datetime como inteiro, ele é tratado como Unix timestamp (UTC). `1546300800` representa `'2019-01-01 00:00:00'` UTC. No entanto, como a coluna `timestamp` tem o fuso horário `Asia/Istanbul` (UTC+3) especificado, ao ser exibido como string, o valor será mostrado como `'2019-01-01 03:00:00'`
* Ao inserir um valor em string como datetime, ele é tratado como estando no fuso horário da coluna. `'2019-01-01 00:00:00'` será tratado como estando no fuso horário `Asia/Istanbul` e salvo como `1546290000`.

**2.** Filtragem de valores `DateTime`

```sql theme={null}
SELECT * FROM dt WHERE timestamp = toDateTime('2019-01-01 00:00:00', 'Asia/Istanbul')
```

```text theme={null}
┌───────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00 │        1 │
└─────────────────────┴──────────┘
```

Os valores da coluna `DateTime` podem ser filtrados usando um valor em formato de string no predicado `WHERE`. Ele será convertido automaticamente para `DateTime`:

```sql theme={null}
SELECT * FROM dt WHERE timestamp = '2019-01-01 00:00:00'
```

```text theme={null}
┌───────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00 │        1 │
└─────────────────────┴──────────┘
```

**3.** Como obter o fuso horário de uma coluna do tipo `DateTime`:

```sql theme={null}
SELECT toDateTime(now(), 'Asia/Istanbul') AS column, toTypeName(column) AS x
```

```text theme={null}
┌──────────────column─┬─x─────────────────────────┐
│ 2019-10-16 04:12:04 │ DateTime('Asia/Istanbul') │
└─────────────────────┴───────────────────────────┘
```

**4.** Conversão de fusos horários

```sql theme={null}
SELECT
toDateTime(timestamp, 'Europe/London') AS lon_time,
toDateTime(timestamp, 'Asia/Istanbul') AS istanbul_time
FROM dt
```

```text theme={null}
┌───────────lon_time──┬───────istanbul_time─┐
│ 2019-01-01 00:00:00 │ 2019-01-01 03:00:00 │
│ 2018-12-31 21:00:00 │ 2019-01-01 00:00:00 │
└─────────────────────┴─────────────────────┘
```

Como a conversão de fuso horário altera apenas os metadados, a operação não tem custo computacional.

<div id="limitations-on-time-zones-support">
  ## Limitações no suporte a fusos horários
</div>

Alguns fusos horários podem não ter suporte completo. Há alguns casos:

Se o deslocamento em relação a UTC não for um múltiplo de 15 minutos, o cálculo de horas e minutos pode ficar incorreto. Por exemplo, o fuso horário de Monrovia, na Libéria, tinha deslocamento de UTC -0:44:30 antes de 7 Jan 1972. Se você estiver fazendo cálculos com horários históricos no fuso horário de Monrovia, as funções de processamento de tempo poderão retornar resultados incorretos. Ainda assim, os resultados após 7 Jan 1972 estarão corretos.

Se a transição de horário (devido ao horário de verão ou por outros motivos) tiver ocorrido em um instante que não seja múltiplo de 15 minutos, você também poderá obter resultados incorretos nesse dia específico.

Datas de calendário não monotônicas. Por exemplo, em Happy Valley - Goose Bay, o horário foi atrasado em uma hora às 00:01:00 de 7 Nov 2010 (um minuto após a meia-noite). Assim, depois que 6 Nov terminou, houve um minuto inteiro de 7 Nov, depois o horário voltou para 23:01 de 6 Nov e, após mais 59 minutos, 7 Nov começou novamente. O ClickHouse ainda não oferece suporte a esse tipo de situação curiosa. Durante esses dias, os resultados das funções de processamento de tempo podem ficar ligeiramente incorretos.

Existe um problema semelhante na estação antártica Casey no ano de 2010. O horário foi atrasado em três horas em 5 Mar, às 02:00. Se você estiver trabalhando nessa estação antártica, não tenha receio de usar o ClickHouse. Apenas certifique-se de definir o fuso horário como UTC ou esteja ciente das imprecisões.

Mudanças de horário de vários dias. Algumas ilhas do Pacífico mudaram seu deslocamento de fuso horário de UTC+14 para UTC-12. Isso não é um problema, mas pode haver algumas imprecisões se você fizer cálculos com esse fuso horário para momentos históricos nos dias da mudança.

<div id="handling-daylight-saving-time-dst">
  ## Como lidar com o horário de verão (DST)
</div>

O tipo DateTime do ClickHouse com fusos horários pode apresentar comportamentos inesperados durante as transições de horário de verão (DST), principalmente quando:

* [`date_time_output_format`](/pt-BR/reference/settings/formats#date_time_output_format) está definido como `simple`.
* Os relógios são atrasados ("Fall Back"), causando uma sobreposição de uma hora.
* Os relógios são adiantados ("Spring Forward"), causando um intervalo de uma hora.

Por padrão, o ClickHouse sempre escolhe a primeira ocorrência de um horário sobreposto e pode interpretar horários inexistentes durante os adiantamentos do relógio.

Por exemplo, considere a seguinte transição do horário de verão (DST) para a hora padrão.

* Em 29 de outubro de 2023, às 02:00:00, os relógios voltam para 01:00:00 (BST → GMT).
* A hora 01:00:00 – 01:59:59 aparece duas vezes (uma em BST e outra em GMT)
* O ClickHouse sempre escolhe a primeira ocorrência (BST), o que causa resultados inesperados ao adicionar intervalos de tempo.

```sql theme={null}
SELECT '2023-10-29 01:30:00'::DateTime('Europe/London') AS time, time + toIntervalHour(1) AS one_hour_later

┌────────────────time─┬──────one_hour_later─┐
│ 2023-10-29 01:30:00 │ 2023-10-29 01:30:00 │
└─────────────────────┴─────────────────────┘
```

Da mesma forma, durante a transição do horário padrão para o horário de verão, pode parecer que uma hora foi ignorada.

Por exemplo:

* Em 26 de março de 2023, às `00:59:59`, os relógios avançam para 02:00:00 (GMT → BST).
* O intervalo entre `01:00:00` e `01:59:59` não existe.

```sql theme={null}
SELECT '2023-03-26 01:30:00'::DateTime('Europe/London') AS time, time + toIntervalHour(1) AS one_hour_later

┌────────────────time─┬──────one_hour_later─┐
│ 2023-03-26 00:30:00 │ 2023-03-26 02:30:00 │
└─────────────────────┴─────────────────────┘
```

Nesse caso, o ClickHouse retrocede o horário inexistente `2023-03-26 01:30:00` para `2023-03-26 00:30:00`.

<div id="see-also">
  ## Veja também
</div>

* [Funções de conversão de tipos](/pt-BR/reference/functions/regular-functions/type-conversion-functions)
* [Funções para trabalhar com datas e horas](/pt-BR/reference/functions/regular-functions/date-time-functions)
* [Funções para trabalhar com arrays](/pt-BR/reference/functions/regular-functions/array-functions)
* [A configuração `date_time_input_format`](/pt-BR/reference/settings/formats#date_time_input_format)
* [A configuração `date_time_output_format`](/pt-BR/reference/settings/formats#date_time_output_format)
* [O parâmetro de configuração do servidor `timezone`](/pt-BR/reference/settings/server-settings/settings#timezone)
* [A configuração `session_timezone`](/pt-BR/reference/settings/session-settings#session_timezone)
* [Operadores para trabalhar com datas e horas](/pt-BR/reference/operators#operators-for-working-with-dates-and-times)
* [O tipo de dado `Date`](/pt-BR/reference/data-types/date)
