【问题标题】:How can I get the number of days something is overdue in this query?如何获取此查询中逾期的天数?
【发布时间】:2014-10-26 23:01:10
【问题描述】:

我正在尝试获取客户列表、电影列表以及他们的租借逾期天数(如果租借时间超过租借期限)。

由于某种原因,我使用此查询将租赁逾期的天数设为 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);

【问题讨论】:

  • date 列的数据类型是什么?
  • 类型:日期时间,NULL:NO,键:MUL,默认值:NULL

标签: mysql datediff


【解决方案1】:

它返回 null 的原因是因为您在注释日期的值上使用了 DATEDIFF

看这里的这一行:

DATEDIFF(DATEDIFF(return_date, rental_date), rental_duration) 

当你执行里面(返回和租用日期之间的差异)你会得到一个整数。 Rental_duration 也是一个整数,所以当你尝试在它们之间做一个 datediff 时,你会得到 null,因为你没有考虑日期的差异。

所以你应该做的是获取返回和租赁日期的日期差异,然后从中减去租赁期限。该数字将为您提供过期日期的数量。

试试这个:

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 工作台中运行它并获得了以下结果集:

【讨论】:

    【解决方案2】:

    如果用于计算结果的任何值为空,您将得到一个空值。

    另外,你的表情看起来不对,试试:

    Select ...
    datediff(return_date, rental_date) - rental_duration overdue
    from ...
    ...
    where datediff(return_date, rental_date) - rental_duration > 0
    

    【讨论】:

    • 当我尝试在“where 子句”中显示未知列“过期”时
    • 现在我收到错误:BIGINT UNSIGNED 值超出范围
    • 请提供return_date、rental_date和rental_duration三列的示例实际值
    • 我放了一个表格的链接,每个表格的定义都在上面的链接中。
    • rent_duration 给出天数和归还日期的整数,而租赁日期给出项目被租借和归还的日期和时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多