第二篇:如何在clickhouse中实现连续的时间,比如连续的天

2022-04-25 09:24:03 浏览数 (2)

上一篇已经分享了一种实现连续的时间的方式,但是有缺陷,比如连续的月,连续的年,实现起来通过sql还是存在一些难度,今天我这里再分享一种方式,也是有缺陷的。

比如我要实现从2021-09-01到2021-09-05的连续日期,这次我们采用timeslots函数来实现。先看下例子:

代码语言:javascript复制
SELECT timeSlots(toDateTime('2021-09-01 00:00:00', 'UTC'), toUInt32(86400 * 4), 86400) AS day

展示结果如下:

代码语言:javascript复制
┌─day─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ ['2021-09-01 00:00:00','2021-09-02 00:00:00','2021-09-03 00:00:00','2021-09-04 00:00:00','2021-09-05 00:00:00'] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

上面的例子能实现连续的天,但是连续的月和年就会存在一些问题,因为月和年会存在不是固定长时间戳,像我们业务中我就是通过程序来实现连续的年或者连续的月。

下面我们再来看业务中通过开始时间和结束时间实现连续的天,首先我们需要熟悉一下dateDiff函数的使用。

代码语言:javascript复制
date_diff 
别名: dateDiff, DATE_DIFF
语法:
unit — 返回结果的时间单位。String.
支持的时间单位: second, minute, hour, day, week, month, quarter, year.
startdate — 第一个待比较值。Date 或 DateTime.
enddate — 第二个待比较值。Date 或 DateTime.
timezone — 可选参数。 如果指定了,则同时适用于startdate和enddate。如果不指定,则使用startdate和enddate的时区。如果两个时区不一致,则结果不可预料。

案例:求2021-.9.1到2021.9.5号需要多少天
执行命令:
SELECT dateDiff('day', toDateTime('2021-09-01 00:00:00'), toDateTime('2021-09-05 00:00:00'))
输出结果:
┌─dateDiff('day', toDateTime('2021-09-01 00:00:00'), toDateTime('2021-09-05 00:00:00'))─┐
│                                                                                     4 │
└───────────────────────────────────────────────────────────────────────────────────────┘
代码语言:javascript复制
timeSlots
代码语言:javascript复制
语法:timeSlots(StartTime, Duration,[, Size])
功能解析:
它返回一个时间数组,其中包括从从«StartTime»开始到«StartTime   Duration 秒»内的所有符合«size»(以秒为单位)步长的时间点。其中«size»是一个可选参数,默认为1800。

有了这两个函数我们就能实现连续的天了,假如我们实现2021-09-01到2021-09-10的连续的天,例子如下:

代码语言:javascript复制
select arrayJoin(timeSlots(toDateTime('2021-09-01 00:00:00','UTC'),toUInt32(dateDiff('hour',toDateTime('2021-09-01 00:00:00'),toDateTime('2021-09-10 00:00:00'))*3600),86400)) day


┌─────────────────day─┐
│ 2021-09-01 00:00:00 │
│ 2021-09-02 00:00:00 │
│ 2021-09-03 00:00:00 │
│ 2021-09-04 00:00:00 │
│ 2021-09-05 00:00:00 │
│ 2021-09-06 00:00:00 │
│ 2021-09-07 00:00:00 │
│ 2021-09-08 00:00:00 │
│ 2021-09-09 00:00:00 │
│ 2021-09-10 00:00:00 │
└─────────────────────┘

总结:timeSlots也是实现连续的天的一种方式,连续的月和年通过这个还是实现会存在一些问题。要实现连续的天或者连续的年需要通过addYears,addMonths,addWeeks等函数来实现。

0 人点赞