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

Posted

技术标签:

【中文标题】如何从两个日期中创建日期数组?【英文标题】:How to create dates array out of two dates? 【发布时间】:2020-09-07 14:22:43 【问题描述】:

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

例如,start=2020/09/01finish=2020/09/03,结果我想要[2020/09/01, 2020/09/02, 2020/09/03]

我想过timeSlots()函数,但它似乎只适用于时间格式,也许Clickhouse中还有另一个类似dateSlots()的函数?

【问题讨论】:

【参考方案1】: 其他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,
    arrayMap(x -> toDate(x), 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-02','2020-09-03'] │
└────────────┴────────────┴──────────────────────────────────────────┴──────────────────────────────────────────┘
*/

【讨论】:

【参考方案2】:

您可以根据天数差异生成数字,然后根据它生成新日期

SELECT groupArray(
   toDate('2020-09-01') + INTERVAL number DAY
)
FROM numbers(
    toUInt64(
        dateDiff(
            'day',
            toDate('2020-09-01'),
            toDate('2020-09-03')
        ) + 1
    )
)

【讨论】:

以上是关于如何从两个日期中创建日期数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何从两个数组集中“检查”匹配的日期

如何从 iOS 中两个日期范围内的照片库中获取图像?

如何获取两个日期时间之间的日期数组

如何将两个firebase集合组合成一个新的对象数组

如何在参数中指定两个默认日期

从两个表创建一个临时表,选择特定日期之前的最新日期