タイムスパンを表すタイムスタンプのペアを含むテーブルがあります。これらの行はユーザー ID によってスコープされ、各ユーザーは 1 つまたは複数の行を関連付けることができます。
このデータは、ユーザーが週にいつ利用できるかを表す抽象的な「利用可能性」フォームから生成されます。一連の時間範囲をクエリとして入力し、テーブル内のすべての行が一致するすべてのユーザー ID を返す必要があります。
このテーブルを考えると:
CREATE TABLE "public"."availability" (
"id" int4 NOT NULL,
"user_id" int4,
"starts_at" timestamp(6),
"ends_at" timestamp(6),
PRIMARY KEY ("id")
) WITH (OIDS=FALSE)
そしてこのデータ:
User #1 is available Mon-Tue between 08:00 and 17:00
+----+---------+---------------------+---------------------+
| id | user_id | starts_at | ends_at |
+----+---------+---------------------+---------------------+
| 1 | 1 | 2013-03-18 08:00:00 | 2013-03-18 17:00:00 |
+----+---------+---------------------+---------------------+
| 2 | 1 | 2013-03-19 08:00:00 | 2013-03-19 17:00:00 |
+----+---------+---------------------+---------------------+
User #2 is available Sun-Sat all day
+----+---------+---------------------+---------------------+
| 3 | 2 | 2013-03-17 00:00:00 | 2013-03-23 23:59:59 |
+----+---------+---------------------+---------------------+
User #3 is available Wed between 06:00 and 18:00
+----+---------+---------------------+---------------------+
| 4 | 3 | 2013-03-20 06:00:00 | 2013-03-20 18:00:00 |
+----+---------+---------------------+---------------------+
指定されたタイムスタンプのいずれかで利用可能なユーザーを簡単に選択できます。
SELECT * FROM "public"."availability"
WHERE ('2013-03-19 08:35:00' BETWEEN starts_at AND ends_at
AND '2013-03-19 18:25:00' BETWEEN starts_at AND ends_at)
OR ('2013-03-20 12:00:00' BETWEEN starts_at AND ends_at
AND '2013-03-20 18:00:00' BETWEEN starts_at AND ends_at);
+----+---------+---------------------+---------------------+
| id | user_id | starts_at | ends_at |
+----+---------+---------------------+---------------------+
| 3 | 2 | 2013-03-17 00:00:00 | 2013-03-23 23:59:59 |
+----+---------+---------------------+---------------------+
| 4 | 3 | 2013-03-20 06:00:00 | 2013-03-20 18:00:00 |
+----+---------+---------------------+---------------------+
しかし、私が本当に必要としているのは、複数のタイムスパンを照会して、すべての条件にuser_id
一致する のみを返すことができることです。
クエリ: 2013-03-17 10:00:00
- 2013-03-17 16:00:00
, 2013-03-23 10:00:00
-2013-03-23 16:00:00
は以下を返す必要があります:
+----+---------+---------------------+---------------------+
| id | user_id | starts_at | ends_at |
+----+---------+---------------------+---------------------+
| 3 | 2 | 2013-03-17 00:00:00 | 2013-03-23 23:59:59 |
+----+---------+---------------------+---------------------+
クエリ: 2013-03-18 09:00:00
- 2013-03-18 16:00:00
, 2013-03-19 08:00:00
-2013-03-19 15:45:00
は以下を返す必要があります:
+----+---------+---------------------+---------------------+
| id | user_id | starts_at | ends_at |
+----+---------+---------------------+---------------------+
| 1 | 1 | 2013-03-18 08:00:00 | 2013-03-18 17:00:00 |
+----+---------+---------------------+---------------------+
| 2 | 1 | 2013-03-19 08:00:00 | 2013-03-19 17:00:00 |
+----+---------+---------------------+---------------------+
| 3 | 2 | 2013-03-17 00:00:00 | 2013-03-23 23:59:59 |
+----+---------+---------------------+---------------------+
クエリ: 2013-03-18 07:00:00
-2013-03-18 18:00:00
何も返さないはずです。