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');

2 つの入力パラメータがdtfromあり、 を使用してテーブル イベントdaysから選択する必要があります。eventsdtstart >= dtfromgroupby(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比較を使用して範囲を開始します。'Jun 08:00/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 に答える