MS Access \ Jet SQL - время нахождения и выезда персонала, та же таблица, сумма, отработанная на одного сотрудника - PullRequest
0 голосов
/ 29 июня 2018

У меня есть таблица под названием «тайминги». Он содержит сведения о приходе и уходе сотрудников (morn_in, morn_out, днем_ин, днем_ут).

таблица времени Я хотел бы добиться вывода, сгруппированного по staff_ref, SUM их отработанных часов, вот так;

staff_ref|   total_worked|   
   U1            18:00

В настоящее время я использую 4 отдельных запроса для выбора каждого из 'type' (morn_in, morn_out и т. Д.), Один для type = 'morn_in' ниже, этот запрос называется [101 am in] (на него ссылаются позже) ;

SELECT 
staff_ref
, time
, Format([date],"dd/mm/yyyy") AS t_date
FROM timings
WHERE (((type)='morn_in'));  

Затем я СУММАЮ DateDiff между утренними часами;

SELECT 
[101 am in].staff_ref
, Sum(DateDiff("n",[101 am in].[time],[102 am out].[time])) AS morning_mins

FROM [101 am in] INNER JOIN [102 am out] 
 ON ([101 am in].staff_ref = [102 am out].staff_ref) 
 AND ([101 am in].date = [102 am out].date)
GROUP BY [101 am in].staff_ref;

А затем СУММИТЕ дату в дневное время (то же, что и выше) отдельно в другом запросе, затем я добавляю результат этих двух запросов вместе, чтобы получить мой итог.

Как видите, он очень запутанный, и его не просто объяснить.

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

Если я объяснил это ужасно, дайте мне знать, и я внесу поправки.
Спасибо

Редактировать 1 - 03/07/2018
Я использовал приведенный ниже код для извлечения необходимых мне данных, так как это тип данных «время», мне нужно было рассчитать общее количество минут, затем выполнить \ 60 для часов и MOD 60 для минут, так как результаты были более 24 часов.

SELECT 
staff_ref, 
CLng(24*60*CDate(Sum(IIf([type]='morn_out',[time],0)-IIf([type]='morn_in',[time],0)+
IIf([type]='afternoon_out',[time],0)-IIf([type]='afternoon_in',[time],0)))) AS time_mins,
[time_mins]\60 & Format([time_mins] Mod 60,"\:00") AS convert_backHHMM

FROM timings

GROUP BY 
staff_ref, 
fix(time)
;

Я хотел бы знать, как бы я справился с возможностью того, что у таблицы будет время "morning_out", но НЕТ времени "morning_in" (или наоборот). [Внешний интерфейс системы защищает от этого, но мне действительно любопытно и я хочу учиться}.

Спасибо за любую помощь

1 Ответ

0 голосов
/ 29 июня 2018

Попробуйте это:

SELECT 
    staff_ref,
    Sum(IIf([Type] = "morn_out", [date], 0) - IIf([Type] = "morn_in", [date], 0) +
        IIf([Type] = "afternoon_out", [date], 0) - IIf([Type] = "afternoon_in", [date], 0)) As TotalTime
FROM 
    [101 am in]
GROUP BY
    staff_ref,
    Fix([date]);

Примените формат к TotalTime, скажем, ч: nn

...