我正在用日历来解决这个问题。
我必须提取所有记录(事件)(通过选择): 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.它们按出现顺序发生,包括可重复事件的多次出现。
答案 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;