Как узнать, сколько дней просрочено в этом запросе?
Я пытаюсь получить список клиентов, фильмы и количество дней, в течение которых их прокат просрочен (если этот прокат был продлен дольше срока аренды).
По какой-то причине я получаю NULL за количество дней, в течение которых аренда просрочена с использованием этого запроса.
Я получил таблицы с этого ресурса:
http://dev.mysql.com/doc/sakila/en/sakila-structure-tables.html
Вот мой запрос:
SELECT first_name, last_name, title, DATEDIFF(DATEDIFF(return_date,rental_date), rental_duration)
FROM sakila_customer
JOIN sakila_rental USING (customer_id)
JOIN sakila_inventory USING (inventory_id)
JOIN sakila_film USING (film_id)
WHERE sakila_film.rental_duration < DATEDIFF(sakila_rental.return_date,sakila_rental.rental_date);
2 ответа
Причина, по которой он возвращает null, заключается в том, что вы используете DATEDIFF
на значениях, которые являются датами примечания.
Посмотрите на эту строку прямо здесь:
DATEDIFF(DATEDIFF(return_date, rental_date), rental_duration)
Когда вы выполните внутреннюю часть (разницу между датой возврата и аренды), у вас будет целое число. rental_duration также является целым числом, поэтому, когда вы пытаетесь ввести датировку между ними, вы получаете нулевое значение, потому что вы не берете разницу дат.
Итак, что вам нужно сделать, это получить дату возврата и дату аренды, а затем вычесть из этого срок аренды. Это число даст вам число просроченных дат.
Попробуй это:
SELECT first_name, last_name, title, (DATEDIFF(return_date, rental_date) - rental_duration) AS daysOverdue
FROM customer
JOIN rental USING (customer_id)
JOIN inventory USING (inventory_id)
JOIN film USING (film_id)
WHERE rental_duration < DATEDIFF(return_date, rental_date);
Я скачал базу данных по вашей ссылке и запустил ее в MySQL, и получил такой набор результатов:
Вы получите нулевое значение, если любое из значений, использованных для вычисления результата, является нулевым.
Кроме того, ваше выражение выглядит не так, попробуйте:
Select ...
datediff(return_date, rental_date) - rental_duration overdue
from ...
...
where datediff(return_date, rental_date) - rental_duration > 0