更新答案:
在case语句中使用generate\u series构建序列,类似于我在原始答案中所做的ohw,频率根据列的不同而不同
recurring_schedule
。
指定希望序列生成为绝对日期的日期
'2020-01-01'::timestamptz
正如我在下面使用的,of可以传递一个相对日期,例如。
NOW() + INTERVAL '10 weeks'
相反
SELECT id event_id, start_at,
CASE recurring_schedule
WHEN 'Weekly'
THEN GENERATE_SERIES(start_at, '2020-01-01'::timestamptz, '1 weeks'::INTERVAL)
WHEN 'Bi-Weekly'
THEN GENERATE_SERIES(start_at, '2020-01-01'::timestamptz, '2 weeks'::INTERVAL)
WHEN 'Monthly'
THEN GENERATE_SERIES(start_at, '2020-01-01'::timestamptz, '1 month'::INTERVAL)
ELSE NULL
END recurring_start_time
FROM events;
带有json字段的架构的原始答案:
datetime类型的generate\u series的语法为
generate_series(start_time, end_time, step_interval)
因为您的计划是JSON格式的,包含了时间间隔,所以您可以这样构造查询,并根据需要添加更多的计划类型。
WITH test (id, start_at, place_id, recurring_schedule) AS (
VALUES
(358, '2015-01-23 20:00:00 +0000'::TIMESTAMPTZ, 412,
'{"validations":{"day":[2]},"rule_type":"IceCube::WeeklyRule","interval":1,"week_start":0}'::JSONB),
(359, '2016-01-22 19:30:00 +1100', 414,
'{"validations":{"day":[1]},"rule_type":"IceCube::WeeklyRule","interval":1,"week_start":0}'),
(360, '2016-02-01 19:00:00 +1100', 415,
'{"validations":{"day":[4]},"rule_type":"IceCube::WeeklyRule","interval":1,"week_start":0}'),
(361, '2016-02-01 20:00:00 +0000', 416,
'{"validations":{"day":[4]},"rule_type":"IceCube::WeeklyRule","interval":1,"week_start":0}'),
(362, '2014-02-13 20:00:00 +0000', 417,
'{"validations":{"day":[2]},"rule_type":"IceCube::WeeklyRule","interval":1,"week_start":0}')
)
SELECT id, start_at, place_id,
CASE recurring_schedule->>'rule_type'
WHEN 'IceCube::WeeklyRule'
THEN GENERATE_SERIES(start_at, NOW(), (recurring_schedule->>'interval' || ' WEEK')::INTERVAL)
ELSE NULL
END recurring_start_time
FROM test;