时间间隔内的时间差总和

时间:2014-01-03 18:15:28

标签: sql firebird

我使用Firebird。我想找一个给定联系人的两个日期之间的总工作时间。

有两个表:WORK和PAY

IDWORK | IDCONTACTS | STARTWORK        | ENDWORK
----------------------------------------------------------
 1     | 14         | 04/20/2014 09:02 | 04/20/2014 18:10
 2     | 14         | 04/21/2014 08:41 | 
 3     | 14         | 04/20/2014 08:56 | 04/20/2014 17:01
 4     | 10         | 04/18/2014 09:28 | 04/18/2014 16:22


IDPAY | IDCONTACTS | DATE1            | DATE2            | WORKTIME
--------------------------------------------------------------------
1     | 14         | 04/10/2014 09:02 | 04/27/2014 09:02 |

我想找到DATE1和DATE2之间的总工作时间。在插入和更新之前,我试图在PAY上触发:

begin
    UPDATE PAY
        SET WORKTIME = (SELECT SUM(DATEDIFF(MINUTE FROM STARTWORK TO ENDWORK))
                    FROM WORK, PAY
                         WHERE WORK.IDCONTACTS = PAY.IDCONTACTS
                         AND (STARTWORK BETWEEN DATE1 AND DATE2)
                         GROUP BY WORK.IDCONTACTS)
        WHERE NEW.IDPAY = OLD.IDPAY;
end

但它不起作用。我还必须检查ENDWORK是否具有NULL值并引发错误。

1 个答案:

答案 0 :(得分:1)

我同意@FreshPrinceOfSO,因为使用触发器是一个坏主意。如果你真的需要存储该值,最好先预先计算然后存储它,或者在需要时计算它。

说这个,你没有指定你的Firebird版本,但从版本2.1开始,你可以使用DATEDIFFDSQL中的PSQL功能。

您的案例将如下:

select DATEDIFF(minute, STARTWORK, ENDWORK) from WORK

您可以在相应的在线Firebird documentation中找到该文档参考。此外,如果您在此网站中搜索Firebirddatediff,您会发现更多示例。