选择具有可重复日期时间PostgreSQL的记录

时间:2013-04-18 03:38:43

标签: postgresql datetime intervals

我正在用日历来解决这个问题。

我必须提取所有记录(事件)(通过选择): 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');

问题:

如何查询范围内所有事件的数据库:从NOW到无限,使用LIMIT 10.它们按出现顺序发生,包括可重复事件的多次出现。

1 个答案:

答案 0 :(得分: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;