使用 generate_series 在不同的日期生成多个不同的时间
Generating multiple different times over different days with generate_series
我正在尝试生成不同长度的时间间隔,例如每天上午 0 点到 5 点、上午 10 点到下午 1 点、下午 6 点到晚上 8 点,所以是这样的:
+--------------------------+--------------------------+
|start |finish |
+--------------------------+--------------------------+
|2022-05-17 00:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 20:00:00.000000|
+--------------------------+--------------------------+
这是我目前所拥有的,但它不起作用,因为它生成了两个数组的乘积:
SELECT day + a AS start,
day + b AS finish
FROM GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) day,
UNNEST('{"0 hours", "10 hours", "18 hours"}'::interval[]) a,
UNNEST('{"5 hours", "13 hours", "20 hours"}'::interval[]) b;
结果:
+--------------------------+--------------------------+
|start |finish |
+--------------------------+--------------------------+
|2022-05-17 00:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 00:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 00:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 20:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 20:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 20:00:00.000000|
+--------------------------+--------------------------+
您必须取消两个数组的嵌套 select 才能并行执行(两个数组必须具有相同数量的元素)
SELECT day + c.a AS start,
day + c.b AS finish
FROM GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) day,
(
select
UNNEST('{"0 hours", "10 hours", "18 hours"}'::interval[]) a,
UNNEST('{"5 hours", "13 hours", "20 hours"}'::interval[]) b
) c;
实际上我想出了一个可行的解决方案,但它有点难看,可能有更好的方法:
WITH days AS (SELECT GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) AS day)
SELECT day AS start,
day + INTERVAL '5 hours' AS finish
FROM days
UNION
SELECT day + INTERVAL '10 hours',
day + INTERVAL '12 hours'
FROM days
UNION
SELECT day + INTERVAL '20 hours',
day + INTERVAL '22 hours'
FROM days
ORDER BY start;
我正在尝试生成不同长度的时间间隔,例如每天上午 0 点到 5 点、上午 10 点到下午 1 点、下午 6 点到晚上 8 点,所以是这样的:
+--------------------------+--------------------------+
|start |finish |
+--------------------------+--------------------------+
|2022-05-17 00:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 20:00:00.000000|
+--------------------------+--------------------------+
这是我目前所拥有的,但它不起作用,因为它生成了两个数组的乘积:
SELECT day + a AS start,
day + b AS finish
FROM GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) day,
UNNEST('{"0 hours", "10 hours", "18 hours"}'::interval[]) a,
UNNEST('{"5 hours", "13 hours", "20 hours"}'::interval[]) b;
结果:
+--------------------------+--------------------------+
|start |finish |
+--------------------------+--------------------------+
|2022-05-17 00:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 00:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 00:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 10:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 05:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 13:00:00.000000|
|2022-05-17 18:00:00.000000|2022-05-17 20:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 00:00:00.000000|2022-05-18 20:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 10:00:00.000000|2022-05-18 20:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 05:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 13:00:00.000000|
|2022-05-18 18:00:00.000000|2022-05-18 20:00:00.000000|
+--------------------------+--------------------------+
您必须取消两个数组的嵌套 select 才能并行执行(两个数组必须具有相同数量的元素)
SELECT day + c.a AS start,
day + c.b AS finish
FROM GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) day,
(
select
UNNEST('{"0 hours", "10 hours", "18 hours"}'::interval[]) a,
UNNEST('{"5 hours", "13 hours", "20 hours"}'::interval[]) b
) c;
实际上我想出了一个可行的解决方案,但它有点难看,可能有更好的方法:
WITH days AS (SELECT GENERATE_SERIES('2022-05-17'::timestamp, '2022-05-18'::timestamp, '1 day'::interval) AS day)
SELECT day AS start,
day + INTERVAL '5 hours' AS finish
FROM days
UNION
SELECT day + INTERVAL '10 hours',
day + INTERVAL '12 hours'
FROM days
UNION
SELECT day + INTERVAL '20 hours',
day + INTERVAL '22 hours'
FROM days
ORDER BY start;