假设我有一个名为events
的表:
CREATE TABLE events (
id integer,
dtstart timestamptz);
INSERT INTO events VALUES
(4,'2010-06-29 04:00:00'),
(5,'2010-06-29 13:00:00'),
(6,'2011-07-01 20:00:00'),
(7,'2012-07-03 14:30:00');
有两个输入参数dtfrom
和days
我需要从events
表事件中选择dtstart >= dtfrom
,其中groupby(date(dtstart)) <= days
。
例如,使用上表和dtfrom='2010-06-29'
以及days=2
我应该会收到以下事件:
(4,'2010-06-29 04:00:00'),
(5,'2010-06-29 13:00:00'),
(6,'2011-07-01 20:00:00'),
我现在就谈到这个:
SELECT DATE(dtstart) AS _dtstart
FROM events
WHERE dtstart > '2010-06-29 00:00:00'
GROUP BY _dtstart
ORDER BY _dtstart
LIMIT 2;
但我想避免分组。
我需要获取下一个days
天内存在的事件。天不应该包括没有事件的日子。
换句话说:获取在“2010-06-29 00:00:00”之后开始的事件,但是他们开始的不同日期的数量不应超过2(或10,或......)。
答案 0 :(得分:1)
我认为,dtfrom
属于timestamptz
类型,days
是整数。
如果我理解你的问题,这就是你所需要的(也在SQL Fiddle上):
WITH r AS (
SELECT '2010-06-29 00:00:00'::timestamptz dtfrom,
2 days)
SELECT *
FROM events e, r
WHERE e.dtstart >= r.dtfrom
AND date(e.dtstart) < date(r.dtfrom + ((r.days+1)||' days')::interval);
WITH
查询来指定输入参数; timestamptz
比较来开始范围,'cos可能指定Jun / 29的08:00
而记录#4没有进入范围; date
比较作为范围的结尾,将额外的一天添加到指定的数字,因为date()
转换将截止时间。this query会产生所需的输出吗?
SELECT *
FROM events e
WHERE e.dtstart >= '2010-06-29 00:00:00'
ORDER BY e.dtstart
LIMIT 3;