0

假设,我有一张名为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');

有两个输入参数dtfromdays我需要从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,或...)。

4

1 回答 1

1

我假设,那dtfromtimestamptz类型并且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);
  1. 我使用WITH查询来指定输入参数;
  2. 使用timestamptz比较来开始范围,因为可能会指定08:00Jun/29 并且记录 #4 没有进入范围;
  3. 使用date比较结束范围,在指定数字上增加 1 天,因为date()转换将中断小时。

此查询是否产生所需的输出?

SELECT *
  FROM events e
 WHERE e.dtstart >= '2010-06-29 00:00:00'
 ORDER BY e.dtstart
 LIMIT 3;
于 2013-02-07T09:41:18.580 回答