timespan을 나타내는 타임 스탬프 쌍이 포함 된 테이블이 있습니다. 이 행은 사용자 ID별로 범위가 지정되며 각 사용자는 하나 이상의 행을 연관시킬 수 있습니다.PostgreSQL SELECT는 여러 행에 걸쳐 일치해야합니다.
이 데이터는 주중에 사용자를 사용할 수있는 시간을 나타내는 추상 "가용성"형식으로 생성됩니다. 일련의 시간 범위를 쿼리로 입력하고 모든 행이 일치하는 모든 사용자 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 |
+----+---------+---------------------+---------------------+
하지만 실제로 필요한 것은 timespans를 여러 번 쿼리하고 모두과 일치하는 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
아무것도 반환해야 .
SQLFiddle : http://sqlfiddle.com/#!12/b0fcf/4 –
@CraigRinger 감사합니다! 나는 SQLfiddle을 모르고 있었고, 유용했다. –
질문을 수정 해 주셔서 감사합니다. 나는 지금 당장 무관심한 대답을 없애고 다른 사람들에게 내가 지금 시간이 없어서 그 일을 맡길 것이다. –