У меня есть таблица, содержащая пару временных меток, которые представляют временной интервал. Эти строки ограничены идентификатором пользователя, и каждый пользователь может иметь одну или несколько строк, связанных с ними.PostgreSQL SELECT должен соответствовать нескольким строкам
Эти данные генерируются из абстрактной формы «доступности», которая отображается, когда пользователь доступен в течение недели. Мне нужно ввести ряд временных диапазонов в качестве запроса и вернуть все идентификаторы пользователей, для которых все строки в таблице соответствуют.
Учитывая эту таблицу:
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
s, которые соответствуют всем условий.
Запрос: 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
не должен возвращать ничего ,
SQLFiddle: http://sqlfiddle.com/#!12/b0fcf/4 –
@CraigRinger спасибо! Я не знал о SQLfiddle, это полезно. –
Спасибо, что пересмотрели вопрос. Я уберу свой теперь нерелевантный ответ и дам другим на него, поскольку у меня нет времени. –