Date
Date 不包含具体的时间信息,只精确到天,支持字符串形式写入。
范围:1970-01-01 - 2149-12-31
存储日期值时不带时区
例子
创建表:
CREATE TABLE dt
(
`timestamp` Date,
`event_id` UInt8
)
ENGINE = TinyLog;
插入数据:
INSERT INTO dt Values (1546300800, 1), ('2019-01-01', 2);
SELECT * FROM dt;
执行结果:
┌──timestamp─┬─event_id─┐
│ 2019-01-01 │ 1 │
│ 2019-01-01 │ 2 │
└────────────┴──────────┘
Datetime
范围 [1970-01-01 00:00:00, 2105-12-31 23:59:59] 可以配合时区使用。
精确到秒,支持用字符串形式插入。
语法:
DateTime([timezone])
例子
创建表:
CREATE TABLE dt
(
`timestamp` DateTime('Europe/London'),
`event_id` UInt8
)
ENGINE = TinyLog;
插入数据,支持时间戳、字符串:
INSERT INTO dt Values ('2019-01-01 00:15:30', 2);
查询:
SELECT * FROM dt;
结果:
┌───────────timestamp─┬─event_id─┐
│ 2019-01-01 08:15:30 │ 2 │
└─────────────────────┴──────────┘
解释: 插入字符串类型的日期时,认为是该时区的,不做额外处理
默认取系统时区
不指定时区,默认取系统时区
CREATE TABLE dt2
(
`timestamp` DateTime(),
`event_id` UInt8
)
ENGINE = TinyLog;
指定上海时区
CREATE TABLE dt4
(
`timestamp` DateTime('Asia/Shanghai'),
`event_id` UInt8
)
ENGINE = TinyLog;
时区转换
SELECT
toDateTime(timestamp, 'Europe/London') as lon_time,
toDateTime(timestamp, 'Europe/Moscow') as mos_time
FROM dt
执行结果:
┌───────────lon_time──┬────────────mos_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 │
└─────────────────────┴─────────────────────┘
Datetime64
可以记录亚秒,在Datetime上增加了精度的设置。
支持的范围从 1925 年 1 月 1 日到 2283 年 12 月 31 日
语法
DateTime64(precision, [timezone])
例子
创建表:
CREATE TABLE dt
(
`timestamp` DateTime64(3, 'Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
插入数据:
INSERT INTO dt Values ('2019-01-01 00:00:00', 2);
SELECT * FROM dt;
查询结果:
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │ 2 │
└─────────────────────────┴──────────┘
对值进行筛选DateTime64
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 │
└─────────────────────────┴──────────┘
感谢:
https://blog.csdn.net/vkingnew/article/details/106644698