我被要求确定员工在微软访问中保存的数据库工作的时间。基本上,表包含员工ID,任务标识符(作业编号),状态(1表示作业已启动,2表示作业已结束)以及事件的日期时间。
只有一个人可以从事任何工作,一旦开始,他们必须在开始另一个任务之前完成任务。数据库中的条目可能类似于
EmpID TaskID TaskStatus TaskDate
1 A001 1 15/09/12 09:00
2 A023 1 15/09/12 09:00
1 A001 2 15/09/12 09:30
3 A011 1 15/09/12 09:35
3 A011 2 15/09/12 09:45
1 A016 1 15/09/12 09:45
2 A023 2 15/09/12 09:45
..
我需要制作一份显示
的报告EmpID TaskID Time Take
1 A001 0:30
2 A023 0:45
3 A011 0:10
除此之外,我还需要列出那些花费不到一定时间的任务(用于确保在快速完成的工作中仍能达到质量标准)。
感谢所有的帮助。
答案 0 :(得分:1)
此查询将为您提供每个TaskID
的持续时间(以分钟为单位)。未完成的任务(没有TaskStatus=2
的行)将返回Null作为持续时间。如果您希望排除未完成的任务,则可以使用INNER JOIN
。
SELECT
strt.EmpID,
strt.TaskID,
DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken
FROM
YourTable AS strt
LEFT JOIN (
SELECT TaskID, TaskDate
FROM YourTable
WHERE TaskStatus=2
) AS stp
ON strt.TaskID = stp.TaskID
WHERE strt.TaskStatus=1;
注意我仅使用TaskID
作为连接条件,因为“只有一个人可以在任何作业上工作,一旦启动,他们必须在开始另一个之前完成任务”。如果我的解释错误,请更改ON
子句。
根据该查询构建另一个查询以过滤minutes_taken
上的结果。
PARAMETERS target Short;
SELECT
sub.EmpID
sub.TaskID
sub.minutes_taken
FROM
(
SELECT
strt.EmpID,
strt.TaskID,
DateDiff('n',strt.TaskDate,stp.TaskDate) AS minutes_taken
FROM
YourTable AS strt
LEFT JOIN (
SELECT TaskID, TaskDate
FROM YourTable
WHERE TaskStatus=2
) AS stp
ON strt.TaskID = stp.TaskID
WHERE strt.TaskStatus=1
) AS sub
WHERE sub.minutes_taken < target;
答案 1 :(得分:0)
尝试这样的事情:
这是SQL服务器语法,需要将其转换为ms访问,我认为你需要隐藏的唯一事情是cast函数,它将数字转换为字符串
select t1.EmpID,
t1.TaskID,
cast(datediff('n',t1.TaskDate,t2.TaskDate)/60 as varchar(10))+' : '+
cast(datediff('n',t1.TaskDate,t2.TaskDate)%60 as char(2)) as TimeTaken
from table1 t1
inner join table1 t2
on t1.EmpID=t2.EmpID
and t1.TaskID=t2.TaskID
where t1.TaskStatus=1
and t2.TaskStatus=2