我使用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值并引发错误。
答案 0 :(得分:1)
我同意@FreshPrinceOfSO,因为使用触发器是一个坏主意。如果你真的需要存储该值,最好先预先计算然后存储它,或者在需要时计算它。
说这个,你没有指定你的Firebird版本,但从版本2.1
开始,你可以使用DATEDIFF
和DSQL
中的PSQL
功能。
您的案例将如下:
select DATEDIFF(minute, STARTWORK, ENDWORK) from WORK
您可以在相应的在线Firebird documentation中找到该文档参考。此外,如果您在此网站中搜索Firebird
和datediff
,您会发现更多示例。