日期之间的MySQL查询

时间:2015-07-10 20:15:01

标签: mysql

我有下表,可以预订

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
   <item android:state_selected="true" android:drawable="@drawable/selected_gray"/>
   <item android:state_pressed="true" android:drawable="@drawable/pressed_gray"/>
</selector>

然后我有一张跑步表

CREATE TABLE booking (
    bookingID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    customerID INT,
    runID INT,
    startDate DATETIME,
    endDate DATETIME,
    dateBookedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (bookingID),
        INDEX idx_start (startDate),
        INDEX idx_end (endDate),
        FOREIGN KEY (runID) REFERENCES RUn(RunID),
        FOREIGN KEY (customerID) REFERENCES customer(CustomerID)
)

我正在查询运行表,以获取不在预订表中两个日期之间的所有runID,如下所示。

CREATE TABLE run
(
    RunID INT UNSIGNED NOT NULL AUTO_INCREMENT,
    RunName VARCHAR(15),
    PricePerNight DECIMAL(3,2),
    primary key (RunID)
);

如果日期与查询日期重叠,它们如何更改查询以选择在它们之间没有任何日期的runID,它们将包含在结果集中。

即如果新预订的startDate 2015-07-15和endDate 2015-07-21那么它仍将显示在查询结果集中。

1 个答案:

答案 0 :(得分:1)

您的查询可以执行您想要的操作,但可能会有点慢:如果可以,请避免使用NOT IN。这应该做同样的事情但速度更快:

SELECT a.*
FROM   run a
LEFT JOIN booking b ON a.runID=b.runID
AND startDate>= '2015-07-19' AND endDate<= '2015-07-25' 
WHERE b.runID IS NULL;

还要避免从数据库中转换数据:如果你想/必须转换任何东西,转换你的变量:转换变量= 1值转换,从数据库中转换数据是N值转换,加上索引不能已经用完了。