Clickhouse 时区转换

Clickhouse 时区转换

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

OLAP场景的关键特征

  • 大多数是读请求
  • 数据总是以相当大的批(> 1000 rows)进行写入
  • 不修改已添加的数据
  • 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
  • 宽表,即每个表包含着大量的列
  • 较少的查询(通常每台服务器每秒数百个查询或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每一个查询除了一个大表外都很小
  • 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

我们知道在mysql 进行时间的时区转换,可以通过 CONVERT_TZ(dt,from_tz,to_tz),其中dt 是datetime 数据类型;从from_tz 时区转换为to_tz时区,from_tz 可以是任何时区,其中数据库默认时区是UTC

1 /*Mysql从UTC 时区转换成 香港时区(+08:00)*/

SELECT  CONVERT_TZ('2020-04-06 02:00:00','UTC','Asia/Hong_Kong') as DateTime
2020-04-06 10:00:00

2 /*Mysql从 香港时区转换美国纽约时区 */

SELECT  CONVERT_TZ('2020-04-06 02:00:00','Asia/Hong_Kong','America/New_York') as DateTime
2020-04-05 14:00:00

Clickhoue 的from_tz 是默认系统时区,比如UTC 是系统的时区:

Select toString(toDateTime('2020-04-06 02:00:00'), 'Asia/Hong_Kong') AS time_Hong_Kong
2020-04-06 10:00:00

Clickhouse 如果系统默认时间是跟from_tz 时区是一样的,可以不写

select toTimeZone(toDateTime('2020-04-06 02:00:00', 'UTC'), 'Asia/Hong_Kong')  ,
       toString(toDateTime('2020-04-06 02:00:00','UTC'), 'Asia/Hong_Kong')  ,
       toTimeZone(toDateTime('2020-04-06 02:00:00'), 'Asia/Hong_Kong')  ,/*系统默认时间是UTC时区,可以不用写UTC 时间*/
       toString(toDateTime('2020-04-06 02:00:00'), 'Asia/Hong_Kong')  ,/*系统默认时间是UTC时区,可以不用写UTC 时间*/
       toTimeZone(toDateTime('2020-04-06 02:00:00', 'America/New_York'), 'Asia/Hong_Kong') /*其中2020-04-06 02:00:00 所属时区是America/New_York*/

通过上面的例子,大家会发现toTimeZone,与toString 的功能很像,其实我们通过toTypeName这个函数就可以知道它们的区别

select toTypeName(toTimeZone(toDateTime('2020-04-06 02:00:00', 'UTC'), 'Asia/Hong_Kong'))   ,
       toTypeName(toString(toDateTime('2020-04-06 02:00:00','UTC'), 'Asia/Hong_Kong'))  ,
       toTypeName(formatDateTime(toTimeZone(toDateTime('2020-04-06 02:00:00', 'UTC'), 'Asia/Hong_Kong'),'%F %T')) ;

嘻嘻,运行一下上面的代码,你就会知道了。
toTimeZone函数还是比较强大,通过可以实现时区转换,通过toTypeName还可以获知字段类型,以及该字段对应的时区。

原文地址:https://www.cnblogs.com/thxj/p/12642041.html