2014-01-03 6 views
1

Я использую Firebird. Я хочу найти общее время работы между двумя датами для данного контакта.Суммарная временная разница между интервалами времени

Есть две таблицы: работать и платить

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

Не храните рассчитанные поля. Триггер может резко повлиять на производительность. – Kermit

ответ

1

Я согласен с @FreshPrinceOfSO в том, что это плохая идея использовать триггер для этого. Если вам действительно нужно сохранить это значение, было бы лучше предварительно просчитать его, а затем сохранить или вычислить, когда это необходимо.

сказал это, вы не указали версию Firebird, но начиная с версии 2.1 года вы можете использовать функцию DATEDIFF как в DSQL и PSQL.

Пример для Вашего случая будет следующее:

select DATEDIFF(minute, STARTWORK, ENDWORK) from WORK 

Вы можете найти ссылку DOC в его соответствующий онлайн Firebird documentation. Кроме того, если вы ищете на этом сайте для Firebird и datediff, вы найдете еще несколько примеров.

Смежные вопросы