Permite armazenar um instante, que pode ser expresso como uma data de calendário e uma hora do dia, com precisão de frações de segundo definida
Tamanho do tick (precisão): 10-precision segundos. Intervalo válido: [ 0 : 9 ].
Normalmente, usam-se 3 (milissegundos), 6 (microssegundos) e 9 (nanossegundos).
Sintaxe:
DateTime64(precision, [timezone])
Internamente, armazena os dados como uma quantidade de ‘ticks’ desde o início da epoch (1970-01-01 00:00:00 UTC) como Int64. A resolução dos ticks é determinada pelo parâmetro de precisão. Além disso, o tipo DateTime64 pode armazenar um fuso horário que é o mesmo para toda a coluna, o que afeta como os valores do tipo DateTime64 são exibidos em formato de texto e como os valores especificados como strings são analisados (‘2020-01-01 05:00:01.000’). O fuso horário não é armazenado nas linhas da tabela (ou no conjunto de resultados), mas nos metadados da coluna. Veja os detalhes em DateTime.
Intervalo de valores compatível: [1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999]
O número de dígitos após o separador decimal depende do parâmetro de precisão.
Observação: a precisão do valor máximo é 8. Se a precisão máxima de 9 dígitos (nanossegundos) for usada, o valor máximo compatível será 2262-04-11 23:47:16 em UTC.
- Criando uma tabela com uma coluna do tipo
DateTime64 e inserindo dados nela:
CREATE TABLE dt64
(
`timestamp` DateTime64(3, 'Asia/Istanbul'),
`event_id` UInt8
)
ENGINE = MergeTree;
-- Analisar DateTime
-- - a partir de um inteiro interpretado como o número de milissegundos (devido à precisão 3) desde 1970-01-01,
-- - a partir de um decimal interpretado como o número de segundos antes da parte decimal, e com base na precisão após o separador decimal,
-- - a partir de uma string.
INSERT INTO dt64
VALUES
(1546300800123, 1),
(1546300800.123, 2),
('2019-01-01 00:00:00', 3);
SELECT * FROM dt64;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │ 1 │
│ 2019-01-01 03:00:00.123 │ 2 │
│ 2019-01-01 00:00:00.000 │ 3 │
└─────────────────────────┴──────────┘
- Ao inserir um datetime como inteiro, ele é tratado como um Unix Timestamp (UTC) com a escala adequada.
1546300800000 (com precisão 3) 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 datetime como decimal, ele é tratado de forma semelhante a um inteiro, exceto pelo fato de que o valor antes do separador decimal é o Unix Timestamp até os segundos, inclusive, e o valor após o separador decimal é tratado como a precisã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ário Asia/Istanbul e armazenado como 1546290000000.
- Filtragem por valores
DateTime64
SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │ 3 │
└─────────────────────────┴──────────┘
Diferentemente de DateTime, os valores DateTime64 não são convertidos automaticamente a partir de String.
SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3);
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │ 1 │
│ 2019-01-01 03:00:00.123 │ 2 │
└─────────────────────────┴──────────┘
Diferentemente de insert, a função toDateTime64 tratará todos os valores como a variante decimal, portanto a precisão deve ser informada após o separador decimal.
- Obtendo um fuso horário para um valor do tipo
DateTime64:
SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x;
┌──────────────────column─┬─x──────────────────────────────┐
│ 2023-06-05 00:09:52.000 │ DateTime64(3, 'Asia/Istanbul') │
└─────────────────────────┴────────────────────────────────┘
- Conversão de fuso horário
SELECT
toDateTime64(timestamp, 3, 'Europe/London') AS lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') AS istanbul_time
FROM dt64;
┌────────────────lon_time─┬───────────istanbul_time─┐
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘
Veja também
Última modificação em 10 de junho de 2026