0

我正面临着日历的这个问题。

我必须提取所有记录(事件)(通过选择):1.特定日期,或 2.可重复日期

问题是普通日历显示整个月份(或特定时间范围),因此可以从子查询生成的子集中选择记录(并比较日期片段),即:

select (generate_series('2012-06-29 00:00:00',
                        '2012-07-03 00:00:00', 
                        '5 minutes'::interval))::timestamp;

我必须构建一个日历视图,就像一个无限的事件列表,你可以向下滚动。所以我必须一个一个地显示事件。当我选择事件(即 2012-06-29 00:00:00 到 2012-10-29 00:00:00)时,语句将不考虑日期为 2012-10-30 00:00:00 的记录,这是意料之外的。

如何选择多个不连续的日期?

数据库架构:

CREATE TABLE "public"."events" (
"id" int4 DEFAULT nextval('events_id_seq'::regclass) NOT NULL,
"date" timestamp(6),
"date_repeat_interval" interval(6),
"date_repeat_start" timestamp(6),
"date_repeat_stop" timestamp(6),
"event_name" varchar(255) NOT NULL
)
WITH (OIDS=FALSE);

在特定日期插入一些常规事件:

INSERT INTO "public"."events" VALUES ('1', '2013-04-18 14:04:39', null, null, null, 'Regular 1');
INSERT INTO "public"."events" VALUES ('2', '2013-04-19 14:04:50', null, null, null, 'Regular 2');

并插入一些间隔为 1 和 2 天的事件,并指定从和到日期的重复:

INSERT INTO "public"."events" VALUES ('3', null, '1 day', '2013-04-16 14:05:26', '2013-04-19 14:05:31', 'Repeatable 1');
INSERT INTO "public"."events" VALUES ('4', null, '2 days', '2013-04-17 14:05:49', '2013-06-15 14:05:53', 'Repeatable 2');

问题:

如何查询数据库范围内的所有事件:从现在到无限,限制为 10。它们按发生顺序发生,包括重复事件的多次发生。

4

1 回答 1

0

您可以使用递归 CTE 执行此操作。请注意,您确实需要为其添加限制,否则它会愉快地重复到无穷大。

WITH RECURSIVE event_calendar AS (
    SELECT id, coalesce("date", date_repeat_start) as e_date, event_name, 0 AS level
      FROM events
     UNION
    SELECT e.id, ec.e_date + date_repeat_interval, ec.event_name, ec.level + 1
      FROM events e
      JOIN event_calendar ec ON e.id = ec.id
     WHERE ec.level <= 10 and e.date_repeat_start is not null 
           and e.date_repeat_stop >= ec.e_date + date_repeat_interval
)
SELECT * FROM event_calendar order by e_date;
于 2013-05-21T02:20:52.130 回答