ClickHouse/docs/ru/sql_reference/data_types/datetime64.md
2020-04-09 21:06:07 +03:00

5.6 KiB
Raw Blame History

DateTime64

Позволяет хранить момент времени, который может быть представлен как календарная дата и время, с заданной суб-секундной точностью.

Размер тика/точность: 10-precision секунд, где precision - целочисленный параметр типа.

Синтаксис:

DateTime64(precision, [timezone])

Данные хранятся в виде количества ‘тиков’, прошедших с момента начала эпохи (1970-01-01 00:00:00 UTC), в Int64. Размер тика определяется параметром precision. Дополнительно, тип DateTime64 позволяет хранить часовой пояс, единый для всей колонки, который влияет на то, как будут отображаться значения типа DateTime64 в текстовом виде и как будут парситься значения заданные в виде строк (2020-01-01 05:00:01.000). Часовой пояс не хранится в строках таблицы (выборки), а хранится в метаданных колонки. Подробнее см. DateTime.

Пример

1. Создание таблицы с столбцом типа DateTime64 и вставка данных в неё:

CREATE TABLE dt
(
    `timestamp` DateTime64(3, 'Europe/Moscow'),
    `event_id` UInt8
)
ENGINE = TinyLog
INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2)
SELECT * FROM dt
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.000 │        1 │
│ 2019-01-01 00:00:00.000 │        2 │
└─────────────────────────┴──────────┘
  • При вставке даты-времени как числа (аналогично Unix timestamp), время трактуется как UTC. Unix timestamp 1546300800 в часовом поясе Europe/London (UTC+0) представляет время '2019-01-01 00:00:00'. Однако, столбец timestamp имеет тип DateTime('Europe/Moscow (UTC+3)'), так что при выводе в виде строки время отобразится как 2019-01-01 03:00:00.
  • При вставке даты-времени в виде строки, время трактуется соответственно часовому поясу установленному для колонки. '2019-01-01 00:00:00' трактуется как время по Москве (и в базу сохраняется '2018-12-31 21:00:00' в виде Unix Timestamp)

2. Фильтрация по значениям даты-времени

SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Europe/Moscow')
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │        2 │
└─────────────────────────┴──────────┘

В отличие от типа DateTime, DateTime64 не конвертируется из строк автоматически

3. Получение часового пояса для значения типа DateTime64:

SELECT toDateTime64(now(), 3, 'Europe/Moscow') AS column, toTypeName(column) AS x
┌──────────────────column─┬─x──────────────────────────────┐
│ 2019-10-16 04:12:04.000 │ DateTime64(3, 'Europe/Moscow') │
└─────────────────────────┴────────────────────────────────┘

4. Конвертация часовых поясов

SELECT
toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
toDateTime64(timestamp, 3, 'Europe/Moscow') as mos_time
FROM dt
┌───────────────lon_time──┬────────────────mos_time─┐
│ 2019-01-01 00:00:00.000 │ 2019-01-01 03:00:00.000 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘

See Also