问题描述
我有两列start
和finish
,我如何创建一个包含这两个日期之间所有日期的数组?
例如start=2020/09/01
finish=2020/09/03
,因此我想拥有[2020/09/01,2020/09/02,2020/09/03]
我考虑过timeSlots()
函数,但是它似乎仅适用于时间格式,也许Clickhouse中还有另一个函数dateSlots()
?
解决方法
- 2种其他方式:
SELECT
toDate('2020-09-01') AS start,toDate('2020-09-03') AS end,arrayMap(x -> toDate(x),timeSlots(toDateTime(start),toUInt32((end - start)*24*60*60),24*60*60)) AS timeslot_result,range(toUInt32(start),toUInt32(end) + 1)) AS range_result
/*
┌──────start─┬────────end─┬─timeslot_result──────────────────────────┬─range_result─────────────────────────────┐
│ 2020-09-01 │ 2020-09-03 │ ['2020-09-01','2020-09-02','2020-09-03'] │ ['2020-09-01','2020-09-03'] │
└────────────┴────────────┴──────────────────────────────────────────┴──────────────────────────────────────────┘
*/
,
您可以从diff天生成数字,然后根据它生成新日期
SELECT groupArray(
toDate('2020-09-01') + INTERVAL number DAY
)
FROM numbers(
toUInt64(
dateDiff(
'day',toDate('2020-09-01'),toDate('2020-09-03')
) + 1
)
)