上一篇已经分享了一种实现连续的时间的方式,但是有缺陷,比如连续的月,连续的年,实现起来通过sql还是存在一些难度,今天我这里再分享一种方式,也是有缺陷的。
比如我要实现从2021-09-01到2021-09-05的连续日期,这次我们采用timeslots函数来实现。先看下例子:
SELECT timeSlots(toDateTime('2021-09-01 00:00:00', 'UTC'), toUInt32(86400 * 4), 86400) AS 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'] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
上面的例子能实现连续的天,但是连续的月和年就会存在一些问题,因为月和年会存在不是固定长时间戳,像我们业务中我就是通过程序来实现连续的年或者连续的月。
下面我们再来看业务中通过开始时间和结束时间实现连续的天,首先我们需要熟悉一下dateDiff函数的使用。
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 │
└───────────────────────────────────────────────────────────────────────────────────────┘
timeSlots
语法:timeSlots(StartTime, Duration,[, Size])
功能解析:
它返回一个时间数组,其中包括从从«StartTime»开始到«StartTime + Duration 秒»内的所有符合«size»(以秒为单位)步长的时间点。其中«size»是一个可选参数,默认为1800。
有了这两个函数我们就能实现连续的天了,假如我们实现2021-09-01到2021-09-10的连续的天,例子如下:
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等函数来实现。