用于存储某一瞬时时刻,该时刻可以表示为日历日期和一天中的时间,并具有可配置的子秒级精度。
时间刻度(精度):10-precision 秒。有效范围:[ 0 : 9 ]。
常用的取值有 3(毫秒)、6(微秒)、9(纳秒)。
语法:
在内部,数据以自纪元开始(1970-01-01 00:00:00 UTC)以来的若干个“tick”形式存储为 Int64。tick 的时间分辨率由 precision 参数决定。此外,DateTime64 类型可以存储一个对整列统一生效的时区,该时区会影响 DateTime64 类型值在文本格式中的显示方式,以及将字符串形式的值(如 2020-01-01 05:00:01.000)解析为 DateTime64 时的方式。时区不会存储在表的行(或结果集)中,而是存储在列的元数据中。详情参见 DateTime。
支持的取值范围:[1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999]
小数点后的位数取决于 precision 参数。
注意:最大值的精度为 8。如果使用 9 位(纳秒级)的最大精度,则在 UTC 时区下支持的最大值为 2262-04-11 23:47:16。
- 创建一个包含
DateTime64 类型列的表,并向其中插入数据:
CREATE TABLE dt64
(
`timestamp` DateTime64(3, 'Asia/Istanbul'),
`event_id` UInt8
)
ENGINE = TinyLog;
-- 解析 DateTime
-- - 从整数解析,此整数被解释为自 1970-01-01 起的微秒数(精度为 3),
-- - 从小数解析,小数点前部分被解释为秒数,小数点后部分则根据精度表示小数秒,
-- - 从字符串解析。
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 │
└─────────────────────────┴──────────┘
- 当以整数形式插入 datetime 时,它会被视为按相应精度缩放的 Unix 时间戳(UTC)。
1546300800000(精度为 3)表示 UTC 的 '2019-01-01 00:00:00'。但是,由于 timestamp 列指定的时区是 Asia/Istanbul(UTC+3),在以字符串形式输出时,该值会显示为 '2019-01-01 03:00:00'。当以小数形式插入 datetime 时,其处理方式与整数类似,只是小数点前的值是精确到秒的 Unix 时间戳,小数点后的部分将被视为精度。
- 当以字符串形式插入 datetime 值时,它会被视为处于该列所使用的时区中。
'2019-01-01 00:00:00' 将被视为处于 Asia/Istanbul 时区,并以 1546290000000 的形式存储。
- 对
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 │
└─────────────────────────┴──────────┘
与 DateTime 不同,DateTime64 类型的值不会自动由 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 │
└─────────────────────────┴──────────┘
与插入操作不同,toDateTime64 函数会将所有值视为小数形式,因此需要在小数点后指定精度。
- 获取
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') │
└─────────────────────────┴────────────────────────────────┘
- 时区转换
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 │
└─────────────────────────┴─────────────────────────┘
另请参阅