2013-03-01 3 views
0

Я создаю систему персональных временных карт как проект для домашних животных, и у меня есть все, что нужно, за исключением суммирования времени на каждый день и на неделю. Скажем, у меня есть 4 ударов за день вытащили из моей базы данных, используя время цикла:Продвинутые подсчеты времени (четные и нечетные ряды)

[1] 2013-03-01 07:00:00 - IN - (FOR DAY) 
[2] 2013-03-01 12:00:00 - OUT (TO LUNCH) 
[3] 2013-03-01 12:30:00 - IN (FROM LUNCH) 
[4] 2013-03-01 15:30:00 - OUT (FOR DAY) 

Моего вопрос, как бы я идти о создании нарастающего итога плюнуть в общей сложности 8 часов? Я думал об этом целыми днями, и в моем сознании не было логического решения. Заранее спасибо!

+1

Вы хотите, чтобы он выплескивал столько строк, сколько требуется, чтобы равняться 8 часам? Это немного сбивает с толку, каковы цифры в конце, представляющие? – Zachrip

+0

Я редактировал отметки времени для ясности. Это временные карты, которые показывают, что я (например) разветвил на сегодняшний день. Я отправился в 7:00 утра, в 12:00, в 12:30 и в 15:30 в общей сложности 8 часов работы. Как я могу использовать PHP для автоматического вычисления этих часов? Благодаря! –

+1

Они хранятся просто так? Это может быть трудно манипулировать, я бы предположил, возможно, используя sql, чтобы хранить их в столбцах «дата» и «время». Но самый простой способ сделать это - сделать это: (4-1) - (3-2) – Zachrip

ответ

2

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

work_periods 
time_in    time_out 
-- 
2013-03-01 07:00:00 2013-03-01 12:00:00 
2013-03-01 12:30:00 2013-03-01 15:30:00 

Если у вас есть такой стол, вы можете легко получить разницу в минутах с timestampdiff().

select time_in, time_out, 
    timestampdiff(minute, time_in, time_out) elapsed_time 
from work_periods; 

Вы можете вернуть те же данные из существующей таблицы. Я думаю, вы должны сделать это только как временный подход. Такая структура затрудняет идентификацию «in» s, в которых отсутствуют «out» и «out» s, в которых отсутствует «in».

create table work_periods (
    work_ts datetime not null, 
    in_or_out varchar(5) not null, 
    primary key (work_ts) 
); 

insert into work_periods values 
('2013-03-01 07:00:00', 'IN'), 
('2013-03-01 12:00:00', 'OUT'), 
('2013-03-01 12:30:00', 'IN'), 
('2013-03-01 15:30:00', 'OUT'); 

«Выход», который идет с каждым «в», является самым ранним «выходом», который позже, чем «в».

select wp1.work_ts time_in, 
     (select min(wp2.work_ts) 
     from work_periods wp2 
     where wp2.work_ts > wp1.work_ts 
      and wp2.in_or_out = 'OUT') time_out 
from work_periods wp1 
where wp1.in_or_out = 'IN'; 

Если у меня был выбор, я бы

  • построить изменяемый вид из этого последнего ЗЕЬЕСТА,
  • кода приложения обновления использовать вид, и, наконец,
  • заменить просмотрите базовую таблицу в начале этого ответа.
+0

Это очень полезно для меня в будущем, спасибо! Проблема, с которой я сталкиваюсь, заключается в том, что весь скрипт уже запрограммирован для структуры, которую у меня есть. Есть ли способ сразу получить два результата с помощью запроса SELECT или вычесть различия с помощью отметки времени unix? Еще раз спасибо! –

+1

Обновленный ответ. Игнорирует временные метки Unix, потому что я ненавижу хранить временные метки Unix в базе данных со страстью, которая горит подобно солнцу. –

+0

Это замечательно, спасибо! –

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