如何从两个日期中创建日期数组?

问题描述

我有两列startfinish,我如何创建一个包含这两个日期之间所有日期的数组?

例如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
    )
)