代码之家  ›  专栏  ›  技术社区  ›  N97

如何在join中使用datediff函数

  •  0
  • N97  · 技术社区  · 8 年前
     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\u日期不在return\u book表中,所以我必须连接issue\u book和return\u book,但是我该如何使用datediff函数?请帮帮我

    1 回复  |  直到 8 年前
        1
  •  1
  •   P.Salmon    8 年前

    鉴于 删除表issue\u book,return\u 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\u books中没有条目。

    也不需要过程或游标,这可以通过update语句实现,如

    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;