时间标准
名称 | 备注 |
GMT | 格林威治标准时间(Greenwich Mean Time) |
UTC | 世界标准时间(Coordinated Universal Time) |
CST | 可认为是本地时间(Central Standard Time) |
DST | 夏令时(Daylight Saving Time),农业上使用,不用关注 |
ISO8601 | 规定时间的表达格式 |
GMT与UTC基本无差别,UTC的精度相对更高一些,GMT来自天文学。
以本初子午线(0度经线)为起点,将全球划分为24个时区。
说明:改图为借用,版权归原著所有。
时差的计算公式: 本地时间=UTC + 时区差
时区差东为正,西为负(比如东八区记为+0800,西五区记为-0500)
ISO规范:
如果时间是UTC则在时间后面加Z表示,其它时区时间则将与UTC的偏移量附加到时间后面。
时间样例:
UTC时间:20180703T224426Z
UTC时间:2018-07-03T22:44:26Z
本地时间:09:30+08:00
Clickhouse时区处理
查看系统时间
[root@localhost ~]# timedatectl
Local time: Wed 2022-01-26 11:27:13 CST
Universal time: Wed 2022-01-26 03:27:13 UTC
RTC time: Wed 2022-01-26 03:34:23
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: n/a
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
查看ClickHouse当前时间
时间查询正常,当前无须修改。
使用DataGrap作为ClickHouse的客户端时区异常的处理:
修改ClickHouse时区方法
1.修改配置文件的<timezone>节点
vim /etc/clickhouse-server/config.xml
<timezone>Asia/Shanghai</timezone>
2.重启
service clickhouse-server restart
涉及日期时间的数据类型:
数据类型 | 精度 | 存储空间(Byte) | 备注 | 样例 |
Date | 日期 | 2 | 表示从 1970-01-01 (无符号) 到当前的日期值 | min:1970-01-01 max:2015-1231 |
DateTime | 秒 | 4 | 1970-01-01 00:00:00 | |
DateTime64 | 亚秒 | Int64类型 | 2020-01-01 05:00:01. |
时间操作:
时间函数
DateTime64(precision, [timezone])
precision:决定时间刻度的分辨率(最大为9)
timezone:指定表的存储时区,不指定为默认时区
将日期时间作为integer类型插入时,它会被视为适当缩放的Unix时间戳(UTC)。
当把字符串作为日期时间插入时,它会被赋予时区信息。
样例1
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);
说明:
1.Europe/Moscow为东三区
2.1546300800000表示2019-01-01 00:00:00(UTC)
样例2
CREATE TABLE dt2
(
`timestamp` DateTime64(9),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt2 Values (1546300800000, 1), ('2019-01-01 00:00:00', 2);
说明:
1.默认时区为东八区
2.1546300800000表示2019-01-01 00:00:00(UTC)
常用的时间函数
获取当前时间
SELECT now()
获取当前日期
select today()
类型转换
字符串转时间
toDateTime('YYYY-MM-DD HH:mm:ss','xxx')
YYYY-MM-DD HH:mm:ss 字符串表达的时间
xxx 时区,省略时采用系统时区
时间转日期
toDate(time,'xxx')
time: 时间
xxx: 时区,省略时采用系统时区
时间转Int
toUInt64(toDateTime('YYYY-MM-DD HH:mm:ss'))
toUnixTimestamp('YYYY-MM-DD HH:mm:ss')
toUnixTimestamp(toDateTime('YYYY-MM-DD HH:mm:ss'))