Velocidade
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.
Observações de uso
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 e também pode ser consultada com SELECT * FROM system.time_zones. A lista 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 nas configurações do servidor ou nas configurações do sistema operacional no momento da inicialização do ClickHouse server.
O clickhouse-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. 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.
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.
Exemplos
DateTime e inserindo dados nela:
- Ao inserir um datetime como número, ele é tratado como Unix timestamp (UTC) em segundos.
1546300800representa'2019-01-01 00:00:00'UTC. No entanto, como a colunatimestamptem o fuso horárioAsia/Istanbul(UTC+3) especificado, ao ser exibido como string, o valor será mostrado como'2019-01-01 03:00:00'. Um número com parte fracionária ou expoente também é aceito e truncado para segundos inteiros, de forma consistente comCAST,toDateTimee o formatoValues. (Antes da versão 26.8, esse número fracionário ou com expoente nos caminhos de entradaJSONeValues/Quoted— este último abrangendo todos os formatos que analisam campos com a regra de escapingQuoted:Values,MySQLDumpeTemplate/CustomSeparated/Regexpconfigurados com escaping de campoQuoted— não era aceito pelo parser de streaming; definainput_format_read_datetime_number_as_raw_value = 1para restaurar esse comportamento. No próprio formatoValues, esse literal ainda funcionava — e continua funcionando no modo de compatibilidade — por meio do fallback de expressão SQL, que o lê como um número de segundos. EmJSONExtracte no tipo de dadosJSON, um valor fracionário é convertido por meio deFloat64, portanto, um valor próximo ao limite de um segundo inteiro pode ser arredondado para o segundo adjacente, diferentemente dos formatos de entrada por linha, que truncam exatamente o texto original. Os formatos de texto separados por tabulação, CSV e outros formatos de texto com escaping não são regidos por essa configuração.) - 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árioAsia/Istanbule salvo como1546290000.
DateTime
DateTime podem ser filtrados usando um valor em formato de string no predicado WHERE. Ele será convertido automaticamente para DateTime:
DateTime:
Limitações no suporte a fusos horários
Como lidar com o horário de verão (DST)
date_time_output_formatestá definido comosimple.- 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.
- 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.
- 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:00e01:59:59não existe.
2023-03-26 01:30:00 para 2023-03-26 00:30:00.
Veja também
- Funções de conversão de tipos
- Funções para trabalhar com datas e horas
- Funções para trabalhar com arrays
- A configuração
date_time_input_format - A configuração
date_time_output_format - O parâmetro de configuração do servidor
timezone - A configuração
session_timezone - Operadores para trabalhar com datas e horas
- O tipo de dado
Date