Как сравнить дату пребывания в отеле больше определенного числа

Я пытаюсь вычислить все бронирования из моей базы данных, которые гости сделали бронирование дольше определенного периода времени. Дата прибытия и дата отъезда указаны в таблице бронирования. Я работаю в 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;

person Hoody    schedule 21.03.2013    source источник


Ответы (2)


В ORACLE DATEDIFF не существует.
Но в Oracle вы можете напрямую использовать операнды + или - между двумя датами.

Таким образом, ваши запросы могут быть: (EDIT, чтобы добавить значение diff в select)

 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;
person JoDev    schedule 21.03.2013
comment
вместо SYSDATE я изменил на b.DEPARTDATE - b.ARRIVEDATE, что работает. Как я могу отобразить фактическое количество бронирований вместе с ним? - person Hoody; 21.03.2013
comment
Просто добавьте (b.DEPARTDATE - b.ARRIVEDATE) as date_diff в предложение SELECT. - person JoDev; 21.03.2013

Попробуйте эквивалент 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

чтобы получить количество ночей.

person Gordon Linoff    schedule 21.03.2013