DATEDIFF
не является допустимой функцией в Oracle; если вы хотите разницу, то вычтите одну дату из другой, и вы получите число, представляющее число дней (или их долю) между значениями.
Если вы хотите считать ее за неделю, начиная с полуночи В понедельник вы можете TRUNC
съесть дату до начала недели ISO (которая будет Полночь понедельника этой недели), а затем сгруппировать и считать:
SELECT MAX( PN.F_NAME ) AS F_NAME,
MAX( PN.L_NAME ) AS L_NAME,
MAX( M.ENROLL_DATE ) AS ENROLL_DATE,
TRUNC( BD.DATE_BORROWED, 'IW' ) AS monday_of_iso_week,
COUNT(*) AS BORROWED_COUNT
FROM PERSON_NAME PN
INNER JOIN MEMBER M
ON ( PN.PID = M.PID )
INNER JOIN BORROW_DETAILS BD
ON ( M.PID = BD.PID )
GROUP BY
PN.PID,
TRUNC( BD.DATE_BORROWED, 'IW' )
HAVING COUNT(*) > 5
ORDER BY BORROWED_COUNT DESC;
дБ <> fiddle
Вы не указали структуры таблиц или примерные данные, поэтому их сложно протестировать; но вам, кажется, нет необходимости включать таблицу HAS
, и я предполагаю, что между человеком и участником существует соотношение 1: 1.
Вы также не хотите GROUP BY
имен как может быть два человека с одинаковыми именем и фамилией (которые записались на одну и ту же дату) и должны использовать что-то, что однозначно идентифицирует человека (я предполагаю, что это PID
).