MS Access\Jet SQL - 员工上下班打卡时间,相同 table,每个员工的全职工作总和
MS Access\Jet SQL - staff clock in & out times, same table, sum full time worked per staff
我下面的 table 名为 'timings'。它包含工作人员的来往 (morn_in、morn_out、afternoon_in、afternoon_out)。
timings table
我想要实现的是按 staff_ref 分组的输出,他们工作时间的总和,就像这样;
staff_ref| total_worked|
U1 18:00
我目前使用 4 个单独的查询 select 每个 '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;
然后在另一个查询中分别对下午时间(同上)的 datediff 求和,然后我将这两个查询的结果加在一起得到我的总数。
正如你所见,它非常复杂,而且解释起来并不简单。
我想知道如何组合查询,因此如果可能的话,我只需要一个语句来 return 结果。
如果我解释得很糟糕,请告诉我,我会进行修改。
谢谢
编辑 1 - 03/07/2018
我使用下面的代码来提取我需要的数据,因为它是 'time' 数据类型,我必须计算总分钟数,然后对小时数执行 \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] & Format([time_mins] Mod 60,"\:00") AS convert_backHHMM
FROM timings
GROUP BY
staff_ref,
fix(time)
;
我想知道如何处理 table 有 "morning_out" 时间但没有 "morning_in" 时间的可能性(反之亦然)。 【系统前端确实对此有防护,但我真的很好奇,想学习】。
感谢您的帮助
试试这个:
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,例如 h:nn
我下面的 table 名为 'timings'。它包含工作人员的来往 (morn_in、morn_out、afternoon_in、afternoon_out)。
timings table 我想要实现的是按 staff_ref 分组的输出,他们工作时间的总和,就像这样;
staff_ref| total_worked|
U1 18:00
我目前使用 4 个单独的查询 select 每个 '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;
然后在另一个查询中分别对下午时间(同上)的 datediff 求和,然后我将这两个查询的结果加在一起得到我的总数。
正如你所见,它非常复杂,而且解释起来并不简单。
我想知道如何组合查询,因此如果可能的话,我只需要一个语句来 return 结果。
如果我解释得很糟糕,请告诉我,我会进行修改。
谢谢
编辑 1 - 03/07/2018
我使用下面的代码来提取我需要的数据,因为它是 'time' 数据类型,我必须计算总分钟数,然后对小时数执行 \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] & Format([time_mins] Mod 60,"\:00") AS convert_backHHMM
FROM timings
GROUP BY
staff_ref,
fix(time)
;
我想知道如何处理 table 有 "morning_out" 时间但没有 "morning_in" 时间的可能性(反之亦然)。 【系统前端确实对此有防护,但我真的很好奇,想学习】。
感谢您的帮助
试试这个:
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,例如 h:nn