如何在join中使用datediff函数

时间:2017-10-08 07:35:49

标签: mysql join

 create procedure fine()
 begin
 declare a integer(10);
 declare b integer(10);
 declare c integer(10);
 declare d integer(10);
 declare cal_fine cursor for select book_id,datediff(return_date,issue_date) 
from return_book where datediff(return_date,issue_date)>10;
open cal_fine;
myloop:loop
fetch cal_fine into a,b;
set c=(b-10)*5;
update return_book set fine=c where book_id=a;
end loop;
close cal_fine;
end;  

我有这个代码找不错,但问题是我的issue_date不在return_book表中所以我必须加入issue_book和return_book但是那我该如何使用datediff函数? Plz帮帮我

1 个答案:

答案 0 :(得分:1)

鉴于       drop table issue_book,return_book;

    create table issue_book (book_id int, issue_date date);
    create table return_book (book_id int, return_date date);

    insert into issue_book values(1,'2017-01-01'), (2,'2017-09-02'),(3,'2017-09-01');
    insert into return_book values(1,'2017-10-08'), (2,'2017-10-08');

此查询

select ib.issue_date,rb.return_date ,datediff(return_date,issue_date) ddiff
from return_book rb
join issue_book ib on rb.book_id=ib.book_id 
where datediff(return_date,issue_date)>10; 

结果

+------------+-------------+-------+
| issue_date | return_date | ddiff |
+------------+-------------+-------+
| 2017-01-01 | 2017-10-08  |   280 |
| 2017-09-02 | 2017-10-08  |    36 |
+------------+-------------+-------+
2 rows in set (0.00 sec)

但是你的逻辑可能存在一个缺陷,即如果一本书没有被退回会发生什么 - 在return_books中没有条目。

也不需要过程或游标,这可以通过像

这样的更新语句来实现
update return_book rb join issue_book ib on rb.book_id=ib.book_id 
 set fine = (datediff(return_date,issue_date) - 10) * 5
 where datediff(return_date,issue_date)>10;