表名: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_Table
Room_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';
Capacity
和ProjectionStatus
是会议室详细信息表格中的列,请暂时忽略该部分。
CHECKIN
和CHECKOUT
是用户在搜索屏幕中提供的值。
但不幸的是,子查询不正确,因此我没有得到理想的结果。
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个。
请帮助我获得正确的查询。
答案 0 :(得分:1)
当日期为字符串时,Sqlite不支持日期比较。为此,您需要将所有数据库端日期转换为数字。
答案 1 :(得分: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';