如何比较入住酒店的日期大于一定数量

时间:2013-03-21 13:44:33

标签: sql oracle sql-date-functions

我正在尝试计算我的数据库中的所有预订,客人预订时间超过一定时间。到达日期和出发日期在预订表中。我正在使用oracle在sqlplus中工作,并且错误无效标识 datediff 弹出。这是我的尝试。我还希望能够显示每个预订alog与打印的日期差异。

SELECT b.BOOKINGID, g.FORENAME, g.SURNAME 
FROM GUEST g, BOOKING b
WHERE g.GUESTID = b.GUESTID AND
DATEDIFF(day, b.DEPARTDATE, b.ARRIVEDATE) > 2;

2 个答案:

答案 0 :(得分:4)

尝试Oracle等效项:

SELECT b.BOOKINGID, g.FORENAME, g.SURNAME 
FROM GUEST g join
      BOOKING b
      on g.GUESTID = b.GUESTID
where  (b.DEPARTDATE - b.ARRIVEDATE) > 2;

我还将查询更改为使用ANSI连接语法。

注意:这假定日期没有时间戳。如果是这样,您可能需要:

where trunc(b.departdate) - trunc(b.arrivedate) > 2

获得夜晚。

答案 1 :(得分:2)

在ORACLE中DATEDIFF不存在 但在Oracle中,您可以在两个日期之间直接使用 + - 操作数。

所以你的requets可能是:(编辑在select中添加diff值)

 SELECT b.BOOKINGID, g.FORENAME, g.SURNAME, 
 CASE WHEN (SYSDATE - b.DEPARTDATE) > 0 THEN CONCAT((SYSDATE - b.DEPARTDATE), ' days late')
 ELSE CONCAT((b.DEPARTDATE - SYSDATE),' days left')
 END AS "Booking Status"
 FROM GUEST g, BOOKING b
 WHERE g.GUESTID = b.GUESTID
 AND (SYSDATE - b.DEPARTDATE) > 2;

此查询仅显示至少2天的预订。

修改

您正在寻找的查询是:(几乎与Gordon Linoff的查询相同)

 SELECT b.BOOKINGID, g.FORENAME, g.SURNAME, (b.DEPARTDATE - b.ARRIVEDATE) as booking_duration
 FROM GUEST g, BOOKING b
 WHERE g.GUESTID = b.GUESTID
 AND (b.DEPARTDATE - b.ARRIVEDATE) > 2;