如何查找数据库中日期时间条目之间经过的时间
Posted
技术标签:
【中文标题】如何查找数据库中日期时间条目之间经过的时间【英文标题】:How to I find time elapsed between date time entries in a database 【发布时间】:2012-10-10 08:45:38 【问题描述】:我被要求确定员工在 Microsoft Access 中保存的数据库中完成一项任务的时间。基本上一张表包含员工 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
除此之外,我只需要列出那些花费少于给定持续时间的任务(用于确保快速完成的工作仍然符合质量标准)。
感谢所有帮助。
【问题讨论】:
请学习使用谷歌(“SQL日期”)。第一个结果是w3schools.com/sql/sql_dates.asp,阅读日期函数 (w3schools.com/sql/func_datediff.asp) 你会对 datediff 感兴趣。 您的数据库中是否有每个员工的 taskStartDatetime 、 taskEndDateTime ? 【参考方案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;
【讨论】:
【参考方案2】:试试这样的:
这是 SQL server 语法,确实需要将其转换为 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
SQL fiddle demo
【讨论】:
当您尝试仅使用join
而不指定类型(内部、左侧或右侧)时,Access db 引擎会引发语法错误。
DateDiff()
第一个参数(间隔)需要一个字符串值。
@HansUp:感谢您的 cmets.. 我已更正它.. Cstr() 用于 cast()?
如果将持续时间表示为字符串值,那么他稍后将如何仅选择持续时间小于目标的那些行?我认为持续时间应该是日期/时间值或纯数字。以上是关于如何查找数据库中日期时间条目之间经过的时间的主要内容,如果未能解决你的问题,请参考以下文章
如何计算 SQL Server 中按日期和用户分组的条目之间的平均时间?