0

考虑上述关系。我正在尝试列出当前住在酒店的所有客人和家属,这意味着他们在房间里。

这是我的 SQL 查询:

SELECT g.FORENAME, g.SURNAME           
    FROM GUEST g
    INNER JOIN BOOKING b 
            ON g.GUESTID = b.GUESTID
    WHERE (b.DEPARTDATE > TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY') AND b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY'))
    UNION   
    SELECT d.FORENAME, d.SURNAME
    FROM DEPENDANT d
    INNER JOIN BOOKINGDEPENDANT bd 
            ON bd.DEPENDANTID = d.DEPENDANTID
    WHERE bd.BOOKINGID IN (SELECT b.BOOKINGID 
                            FROM BOOKING b
                            WHERE (b.DEPARTDATE > TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY') AND b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY')));

查询执行但不显示任何行选择,当它应该时。

这是我的BOOKING插入语句。

INSERT INTO BOOKING VALUES (2002, 5445, '19-MAR-2013', '10-JUN-2013', 250.00);

INSERT INTO BOOKING VALUES (2004, 3005, '19-MAR-2013', '21-MAR-2013', 250.00);

尽管客人 5445 和 3005 满足其关联预订的 where 条件,但未显示任何输出。我期待 5445 和 3005 的名称。

如果我删除以下行:

b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY')

将显示名称列表。但是这个逻辑是错误的,因为如果不考虑,您将无法检测到现在的客人。

我对你的问题是上面的行被错误地添加了吗?为什么在满足条件时不显示那些客人。他们毕竟是现在的客人。我能做些什么?

4

1 回答 1

4

我认为问题在于您正在比较字符串而不是日期。

'19-MAR-2013' < '21-MAR-2013' => TRUE
'10-JUN-2013' > '21-MAR-2013' => FALSE (as '10...' < '21...')

将您的日期作为日期保存在数据库中。如果您需要将它们作为文本进行比较,或者将它们转换为格式 YYYY-MM-DD(因为这样字符串比较将匹配日期比较。

注意:虽然正确的解决方案是更改您的列以将数据保存为日期,但下面是 SQL 的更正版本,它将与文本列一起使用(尽管远没有那么高效/正确):

SELECT g.FORENAME, g.SURNAME           
FROM GUEST g
INNER JOIN BOOKING b 
    ON g.GUESTID = b.GUESTID
WHERE CURRENT_DATE BETWEEN TO_DATE(b.ARRIVEDATE, 'DD-MON-YYYY') AND TO_DATE(b.DEPARTDATE, 'DD-MON-YYYY')

UNION   

SELECT d.FORENAME, d.SURNAME
FROM DEPENDANT d
INNER JOIN BOOKINGDEPENDANT bd 
    ON bd.DEPENDANTID = d.DEPENDANTID
WHERE bd.BOOKINGID IN 
(
    SELECT b.BOOKINGID 
    FROM BOOKING b
    WHERE CURRENT_DATE BETWEEN TO_DATE(b.ARRIVEDATE, 'DD-MON-YYYY') AND TO_DATE(b.DEPARTDATE, 'DD-MON-YYYY')
);
于 2013-03-21T01:33:43.180 回答