【问题标题】: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 ms-access date time


【解决方案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()?
    • 如果将持续时间表示为字符串值,那么他稍后将如何仅选择持续时间小于目标的那些行?我认为持续时间应该是日期/时间值或纯数字。
    猜你喜欢
    • 2023-03-12
    • 2014-02-01
    • 2021-08-06
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2013-12-06
    • 2021-01-07
    相关资源
    最近更新 更多