日期和时间数据类型
拥有全面的日期和时间类型对于有效的时间序列数据管理是必要的,而 ClickHouse 正好提供了这一点。 从紧凑的日期表示到具有纳秒精度的高精度时间戳,这些类型旨在平衡存储效率与不同时间序列应用程序的实际需求。
无论您是在处理历史财务数据、物联网传感器读数,还是未来日期事件,ClickHouse 的日期和时间类型都提供了处理各种时间数据场景所需的灵活性。 支持的类型范围使您能够在保持所需精度的同时优化存储空间和查询性能。
-
Date
类型在大多数情况下应该足够。该类型需要 2 字节来存储一个日期,并将范围限制在[1970-01-01, 2149-06-06]
。 -
Date32
覆盖更广泛的日期范围。它需要 4 字节来存储一个日期,并将范围限制在[1900-01-01, 2299-12-31]
。 -
DateTime
存储的日期时间值具有秒级精度,范围为[1970-01-01 00:00:00, 2106-02-07 06:28:15]
,每个值需要 4 字节。 -
对于需要更高精度的情况,可以使用
DateTime64
。这允许存储具有高达纳秒精度的时间,范围为[1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999]
。每个值需要 8 字节。
让我们创建一个存储各种日期类型的表:
我们可以使用 now()
函数返回当前时间,使用 now64()
以指定的精度获取当前时间作为第一个参数。
这将根据列类型相应地填充我们的列:
时区
许多用例要求同时存储时区。我们可以将时区设为 DateTime
或 DateTime64
类型的最后一个参数:
在我们的 DDL 中定义了时区后,现在可以使用不同的时区插入时间:
现在让我们看一下我们的表中有什么:
在第一行中,我们使用 America/New_York
时区插入了所有值。
dt_1
和dt64_1
在查询时自动转换为Europe/Berlin
。dt_2
和dt64_2
没有指定时区,因此使用服务器的本地时区,在这种情况下是Europe/London
。
在第二行中,我们插入了所有没有时区的值,因此使用了服务器的本地时区。
与第一行一样,dt_1
和 dt_3
被转换为 Europe/Berlin
,而 dt_2
和 dt64_2
则使用服务器的本地时区。
日期和时间函数
ClickHouse 还提供了一组函数,让我们可以在不同的数据类型之间进行转换。
例如,我们可以使用 toDate
将 DateTime
值转换为 Date
类型:
我们可以使用 toDateTime64
将 DateTime
转换为 DateTime64
:
我们可以使用 toDateTime
将 Date
或 DateTime64
还原为 DateTime
: