速度
Date 数据类型比 DateTime 更快。
Date 类型占用 2 字节存储空间,而 DateTime 占用 4 字节。不过,在压缩时,Date 和 DateTime 之间的大小差异会更加明显。这是因为 DateTime 中的分钟和秒字段更难被压缩。相比过滤和聚合 DateTime,过滤和聚合 Date 也更快。
使用说明
DateTime 类型的值以文本格式显示的方式,以及以字符串形式指定的值 ('2020-01-01 05:00:01') 的解析方式。
表中存储的是与时区无关的 Unix timestamp,而时区用于在数据导入/导出期间将其转换为文本格式或从文本格式转换回来,或者用于对这些值执行日历计算 (例如 toDate、toHour 等函数) 。时区不会存储在表的行中 (或结果集中) ,而是存储在列元数据中。
支持的时区列表可在 IANA Time Zone Database 中找到,也可以通过 SELECT * FROM system.time_zones 查询。该列表 在 Wikipedia 上也可以查看。
创建表时,您可以为 DateTime 类型的列显式设置时区。例如:DateTime('UTC')。如果未设置时区,ClickHouse 会使用 ClickHouse server 启动时服务器设置中的 timezone 参数值,或者使用操作系统设置中的值。
如果在初始化数据类型时未显式设置时区,clickhouse-client 默认会使用服务器时区。要使用客户端时区,请在运行 clickhouse-client 时添加 --use_client_time_zone 参数。
ClickHouse 会根据 date_time_output_format 设置的值输出结果。默认的文本格式为 YYYY-MM-DD hh:mm:ss。此外,您还可以使用 formatDateTime 函数更改输出格式。
向 ClickHouse 插入数据时,您可以根据 date_time_input_format 设置的值,使用不同格式的日期时间字符串。
示例
DateTime 类型列的表,并向其中插入数据:
- 当以整数形式插入 datetime 时,它会被视为 Unix 时间戳 (UTC) 。
1546300800表示 UTC 时间'2019-01-01 00:00:00'。不过,由于timestamp列指定了Asia/Istanbul(UTC+3) 时区,因此在以字符串形式输出时,该值会显示为'2019-01-01 03:00:00' - 当以字符串形式插入 datetime 值时,它会被视为采用列时区。
'2019-01-01 00:00:00'会被视为Asia/Istanbul时区的时间,并保存为1546290000。
DateTime 值过滤
DateTime 列的值可以在 WHERE 条件中使用字符串值进行过滤。它会自动转换为 DateTime:
DateTime 类型列的时区:
时区支持的限制
处理夏令时 (DST)
date_time_output_format设置为simple。- 时钟向后拨 (“秋季回拨”) ,导致一小时重叠。
- 时钟向前拨 (“春季前拨”) ,导致一小时空缺。
- 2023 年 10 月 29 日 02:00:00,时钟从 02:00:00 向后拨至 01:00:00 (BST → GMT) 。
- 01:00:00 – 01:59:59 这一小时会出现两次 (一次是 BST,一次是 GMT) 。
- ClickHouse 总是选择第一次出现的时间 (BST) ,因此在增加时间间隔时可能会产生意外结果。
- 在 2023 年 3 月 26 日
00:59:59时,时钟会直接跳到 02:00:00 (GMT → BST) 。 01:00:00–01:59:59这一小时并不存在。
2023-03-26 01:30:00 移回到 2023-03-26 00:30:00。