如何查找数据库时间重叠

时间:2012-06-11 14:26:58

标签: sql database

我正在创建数据库以检查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
)

1 个答案:

答案 0 :(得分:2)

为每列选择合适的数据类型,“ID”列最好为INT。你需要什么“日”专栏?无论如何,你的“start_time”和“end_time”列都有一个日期。

此外,我没有看到“房间”表与其他两个表之间的连接。

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表和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。