рассчитать разницу во времени sql - PullRequest
1 голос
/ 19 апреля 2020

У меня есть таблица SQL с именем tblemptimelog со следующими столбцами; empid как рабочая дата INT, как DATE timein1, как TIME timeout1, как TIME timein2, как TIME timeout2, как TIME

Запрос, который у меня сейчас есть:

"SELECT * FROM tblemptimelog WHERE empid = 1111 ORDER BY workdate";

The results are displayed in a table on my web page as:
|Emp ID | Date       | Time In  | Time Out | Time In  | Time Out
|1111   | 04-18-2020 | 08:00:00 | 12:00:00 | 13:10:05 | 17:00:00
|1111   | 04-19-2020 | 08:00:00 | 12:00:00 | 13:00:00 | 17:00:00

Что здорово. Однако я хочу отобразить разницу во времени между timein1 и timeout1 и разницу во времени между timein2 и timeout2 для каждой строки следующим образом:

|Emp ID | Date       | Time In  | Time Out | Time In  | Time Out | Total Time
|1111   | 04-18-2020 | 08:00:00 | 12:00:00 | 13:10:05 | 17:00:00 | 07:49:55
|1111   | 04-19-2020 | 08:00:00 | 12:00:00 | 13:00:00 | 17:00:00 | 08:00:00

Кроме того, после таблицы я хочу отобразить общее время , В этом случае это будет 15: 49: 55

Итого: 15: 49: 55

Я понятия не имею, как этого добиться. Любые предложения будут с благодарностью

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Извините, что беспокою вас снова, но я столкнулся с проблемой. Я изменил первый запрос, который вы написали:

$sql = select a.*, TIMEDIFF(time_out_1, time_in_1) diff_time_1, TIMEDIFF(time_out_2, time_in_2) diff_time_2,
ADDTIME( TIMEDIFF(time_out_1, time_in_1), TIMEDIFF(time_out_2, time_in_2)) diff_time_1_and_2
from
( 
select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:10:05') time_in_2, TIME('17:00:00') time_out_2
union all  
select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:00:00') time_in_2, TIME('17:00:00') time_out_2
) as a;

to:

SELECT *,
TIMEDIFF(timeout1, timein1) diff_time_1,
TIMEDIFF(timeout2, timein2) diff_time_2,
ADDTIME( TIMEDIFF(timeout1, timein1), TIMEDIFF(timeout2, timein2)) diff_time_1_and_2,
TIME(timein1) time_in_1,
TIME(timeout1) time_out_1,
TIME(timein2) time_in_2,
TIME(timeout2) time_out_2
FROM tblemptimelog
WHERE empid = 1832 ORDER BY workdate

, и все работало так же, как ваш. Однако, когда я пытался изменить второй запрос, чтобы получить общее время, я не получаю правильные результаты. Вот что я изменил ваш исходный второй запрос:

SELECT *,
TIMEDIFF(timeout1, timein1) diff_time_1,
TIMEDIFF(timeout2, timein2) diff_time_2,
ADDTIME( TIMEDIFF(timeout1, timein1), TIMEDIFF(timeout2, timein2)) diff_time_1_and_2,
SEC_TO_TIME(SUM(TIME_TO_SEC(diff_time_1_and_2))) total_time,
TIME(timein1) time_in_1, TIME(timeout1) time_out_1,
TIME(timein2) time_in_2, TIME(timeout2) time_out_2
FROM tblemptimelog
WHERE empid = 1832 ORDER BY workdate

Я получаю сообщение об ошибке: Ошибка: неизвестный столбец 'diff_time_1_and_2' в 'списке полей'

0 голосов
/ 19 апреля 2020

Чтобы ответить на первую часть , вы можете использовать timediff & addtime

Я хочу показать разницу во времени между timein1 и timeout1 и разницу во времени между timein2 и timeout2

select
    a.*,
TIMEDIFF(time_out_1, time_in_1) diff_time_1,
TIMEDIFF(time_out_2, time_in_2) diff_time_2,
ADDTIME( TIMEDIFF(time_out_1, time_in_1), TIMEDIFF(time_out_2, time_in_2)) diff_time_1_and_2
from
    ( 
    select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:10:05') time_in_2, TIME('17:00:00') time_out_2
    union all  
    select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:00:00') time_in_2, TIME('17:00:00') time_out_2
    ) as a

результат

time_in_1|time_out_1|time_in_2|time_out_2|diff_time_1|diff_time_2|diff_time_1_and_2|
---------|----------|---------|----------|-----------|-----------|-----------------|
 08:00:00|  12:00:00| 13:10:05|  17:00:00|   04:00:00|   03:49:55|         07:49:55|
 08:00:00|  12:00:00| 13:00:00|  17:00:00|   04:00:00|   04:00:00|         08:00:00|

Чтобы ответить на вторую часть , вы можете использовать SEC_TO_TIME(SUM(TIME_TO_SEC(time))), чтобы преобразовать в секунды, а затем в сумму, а затем вернуться во время

Также после таблицы я хочу показать общее время. В этом случае это будет 15: 49: 55

Итого: 15: 49: 55

select SEC_TO_TIME(SUM(TIME_TO_SEC(diff_time_1_and_2))) total_time  from ( 
select
    a.*,
TIMEDIFF(time_out_1, time_in_1) diff_time_1,
TIMEDIFF(time_out_2, time_in_2) diff_time_2,
ADDTIME( TIMEDIFF(time_out_1, time_in_1), TIMEDIFF(time_out_2, time_in_2)) diff_time_1_and_2
from
    ( 
    select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:10:05') time_in_2, TIME('17:00:00') time_out_2
    union all  
    select  TIME('08:00:00') time_in_1, TIME('12:00:00') time_out_1, TIME('13:00:00') time_in_2, TIME('17:00:00') time_out_2
    ) as a
    ) as b

результат

total_time|
----------|
  15:49:55|

Easy_peasy!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...