前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第二篇:如何在clickhouse中实现连续的时间,比如连续的天

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

作者头像
公众号-利志分享
发布2022-04-25 09:24:03
1.7K1
发布2022-04-25 09:24:03
举报
文章被收录于专栏:利志分享利志分享

上一篇已经分享了一种实现连续的时间的方式,但是有缺陷,比如连续的月,连续的年,实现起来通过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等函数来实现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 利志分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档