0

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

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;
4

2 回答 2

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

获得晚数。

于 2013-03-21T13:50:19.823 回答
2

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

所以你的请求可能是:(编辑在选择中添加差异值)

 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;
于 2013-03-21T13:50:06.997 回答