我有一个名为“ timings”的下表。它保存着工作人员的来往情况(早上进,早上出,下午进,下午出)。
timings table 我想实现的是一个按staff_ref分组的输出,它们的总工作时间是这样的;
staff_ref| total_worked|
U1 18:00
我目前使用4个单独的查询来选择每个“类型”(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;
然后在另一个查询中分别求和datediff在下午的时间(与上面相同),然后将这两个查询的结果相加在一起得出总数。
您可以看到它非常复杂,而且解释起来并不简单。
我想知道如何组合查询,因此如果可能的话,我只需要一个语句即可返回结果。
如果我已经做了详尽的解释,请告诉我,我将进行修正。
谢谢
编辑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”时间的可能性(反之亦然)。 [系统的前端确实可以防止这种情况,但是我很好奇,想学习}。
感谢您的帮助
答案 0 :(得分:0)
尝试一下:
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]);
将诸如 h:nn
的格式应用于TotalTime