【问题标题】:MS Access\Jet SQL - staff clock in & out times, same table, sum full time worked per staffMS Access\Jet SQL - 员工上班和下班时间、同一张表、每位员工的全职工作总和
【发布时间】:2018-06-29 14:30:30
【问题描述】:

我有一个名为“计时”的下表。它保存着工作人员的进出(morn_in、morn_out、下午进、下午出)。

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;

然后在另一个查询中分别对下午时间(与上面相同)的日期差异求和,然后我将这两个查询的结果加在一起以获得我的总数。

正如您所见,它非常复杂,而且解释起来并不简单。

我想知道如何组合查询,因此如果可能的话,我只需要一条语句即可返回结果。

如果我解释得很糟糕,请告诉我,我会做出修改。
谢谢

编辑 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”时间的可能性(反之亦然)。 [系统的前端确实可以防止这种情况,但我真的很好奇并想学习}。

感谢您的帮助

【问题讨论】:

  • 这里有些东西没有意义。我认为您的示例数据是错误的。假设“U1”的总工作时间应为 18 小时,并提供数据。我看到的总数接近 16.9 小时。另外,您的[time] 列是用来做什么的?

标签: ms-access ms-access-2016 jet-sql


【解决方案1】:

试试这个:

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

【讨论】:

  • 太好了,谢谢。你给了我足够的信息来开始研究和学习(真的很感激)。关于表中的任何杂散数据,我还有一个问题。即如果有“morning_out”时间但没有“morning_in”,则计算将出现偏差(前端系统确实验证了这一点,因此不会发生 - 我更好奇我将如何应对这样的事件)。到目前为止,我已经更新了原始帖子。谢谢
  • 太棒了。照顾丢失的条目将需要更多。您可能需要在 VBA 中循环记录集以验证条目并使用缺少条目的默认值进行计算。
  • 明白。现在VBA,我可以了。我只是想看看我能用这些查询做什么。再次感谢
猜你喜欢
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多