【问题标题】:SQLite sub-query not workingSQLite 子查询不起作用
【发布时间】:2012-04-29 00:32:20
【问题描述】:

表名:MRM_BOOKING_DETAILS
样本数据:

Booking_id USER_ID ROOM_ID CHECKIN             CHECKOUT
1          hary    1       2012-04-16 09:00:00 2012-04-16 09:30:00
2          jenny   2       2012-04-17 13:00:00 2012-04-17 13:30:00
3          steve   1       2012-04-16 15:00:00 2012-04-16 15:30:00

等等……

Booking_id 是主键。 Room_Id 是外键 w.r.t. Room_Details_TableRoom_Id 作为PK。

我的目标是获取用户输入的特定日期、特定时间可用的记录列表。为此,我提出了以下查询:

SELECT ROOMNO,BUILDINGNO 
FROM MRM_ROOM_DETAILS 
WHERE ROOMID IN (SELECT distinct roomid 
                FROM MRM_BOOKING_DETAILS 
                WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00')
                  and (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00'))
  AND CAPACITY > 15 AND PROJECTIONSTATUS = 'NO';

CapacityProjectionStatus 是房间详细信息表中的列,现在请忽略该部分。

CHECKINCHECKOUT 是用户在搜索屏幕中提供的值。

但不幸的是,子查询不正确,因此我没有得到想要的结果。

SELECT distinct roomid 
FROM MRM_BOOKING_DETAILS 
WHERE (CHECKIN NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00') and
      (CHECKOUT NOT BETWEEN '2012-04-13 09:50:00' AND '2012-04-13 10:20:00');

这就是我说子查询不正确的原因。假设用户提供的值为:

CHECKIN : 2012-04-16 09:00:00 and CHECKOUT: 2012-04-16 09:30:00

有了表中的上述数据,ROOM_ID 1 和 2 都会返回。对于第一行,它将失败,但对于第二行和第三行它将成功,因此它将返回不正确的 1 和 2。正确的结果应该只有 2。

请帮助我得到正确的查询。

【问题讨论】:

    标签: android sql select sqlite scheduling


    【解决方案1】:

    将您的逻辑从“在 x 时间以外的时间预订的房间”更改为“在 x 时间未预订的房间”。

    另外,您可能应该使用DATETIME 函数。

    更新

    我已经添加了对所有交叉路口的检查,并且没有使用包含 BETWEEN 以便可以在 8:30 到 9:00 和 9:00 到 9:30 预订房间。

    SELECT ROOMNO, BUILDINGNO 
    FROM MRM_ROOM_DETAILS 
    WHERE ROOMID NOT IN (
        SELECT DISTINCT ROOM_ID as ROOMID
        FROM MRM_BOOKING_DETAILS 
        WHERE (DATETIME(CHECKIN) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKIN) < DATETIME('2012-04-16 09:31:00'))
            OR (DATETIME(CHECKOUT) > DATETIME('2012-04-16 08:30:00') AND DATETIME(CHECKOUT) < DATETIME('2012-04-16 09:31:00'))
            OR (DATETIME('2012-04-16 08:30:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 08:30:00') < DATETIME(CHECKOUT))
            OR (DATETIME('2012-04-16 09:31:00') > DATETIME(CHECKIN) AND DATETIME('2012-04-16 09:31:00') < DATETIME(CHECKOUT))
    )
        AND CAPACITY > 15
        AND PROJECTIONSTATUS = 'NO';
    

    【讨论】:

      【解决方案2】:

      当日期是字符串时,Sqlite 不支持日期比较。为此,您需要将所有数据库端日期转换为数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多