我正在创建数据库以检查 Room
在输入的时间内是否可用。我在编写查询时遇到问题。如果与输入的时间重叠,查询必须检查 Schedule
表和 Reservation
表。如果有重叠,查询最好返回 TRUE
,如果没有重叠,则返回 FALSE
。这是好的数据库结构吗(这样我就可以只专注于查询)或者我需要重组数据库?请帮助我。
我的数据库:
CREATE TABLE "Room" (
"ID" VARCHAR PRIMARY KEY NOT NULL UNIQUE,
"Name" VARCHAR NOT NULL,
"Location" VARCHAR NOT NULL,
"Capacity" INTEGER
)
CREATE TABLE "Schedule" (
"ID" VARCHAR,
"Day" VARCHAR,
"start_time" DATETIME,
"end_time" DATETIME
)
CREATE TABLE "Reservation" (
"ID" VARCHAR PRIMARY KEY NOT NULL,
"Day" VARCHAR NOT NULL,
" start_time " DATETIME NOT NULL,
" end_time " DATETIME NOT NULL,
"User" VARCHAR
)
最佳答案
为每一列选择合适的数据类型,“ID”列最好是INT
。您需要“日”列做什么?无论如何,您的“开始时间”和“结束时间”列中都有一个日期。
此外,我没有看到“房间”表与其他两个表之间的联系。
CREATE TABLE "Room" (
"ID" INT PRIMARY KEY NOT NULL UNIQUE,
"Name" VARCHAR NOT NULL,
"Location" VARCHAR NOT NULL,
"Capacity" INT
)
CREATE TABLE "Schedule" (
ID INT,
start_time DATETIME,
end_time DATETIME,
room_id INT
)
CREATE TABLE "Reservation" (
"ID" INT PRIMARY KEY NOT NULL,
"start_time " DATETIME NOT NULL,
"end_time " DATETIME NOT NULL,
"User" VARCHAR /*you might want to make this an INT, too, and put the users in an extra table*/
, room_id INT
)
我不知道您使用的是什么 DBMS,所以我也不知道正确的语法,但您最好在 Schedule 和 Reservation 表中的 room_id 列上放置一个外键,引用 Room 表中的 id 列。
然后你这样做:
SELECT
*
FROM
Room
LEFT JOIN Schedule ON Room.id = Schedule.room_id
LEFT JOIN Reservation ON Room.id = Reservation.room_id
WHERE
(
(Schedule.start_time <= $yourStartTime AND Schedule.end_time > $yourEndTime)
OR
(Reservation.start_time <= $yourStartTime AND Reservation.end_time > $yourEndTime)
)
AND Room.id = $yourRoomId
此查询在房间已满时返回一些内容,而在房间空闲时返回空值/NULL。
关于sql - 如何找到数据库时间重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982053/