寻找时间差异

3

我正在尝试在MS Access中执行以下查询,以找到两个时间之间的差异。时间格式为例如开始时间8:00和结束时间14:00。但是,我在查询中遇到错误,请帮我修复。

PARAMETERS [Enter Date] DateTime;

SELECT
    M.CompanyID AS Emp_ID,
    MIN(H.EventTime) AS Attending,
    MAX(H.EventTime) AS Leaving,
    Format( (Leaving-Attending), "hh:mm:ss") AS TotalHrs
FROM
    Member AS M
    LEFT JOIN History AS H ON M.UserID = H.EventUserID 
    AND
    ( Format( [EventDate], "dd/mm/yyyy" ) ) = [Enter Date]    
WHERE
    companyId NOT IN (select companyid from exceptions)
GROUP BY
    M.CompanyID, EventDate
ORDER BY
    CompanyId;

Ayha

请查看以下链接:http://allenbrowne.com/casu-13.html;http://www.dbforums.com/microsoft-access/1641804-query-calculate-difference-between-two-times.html;http://office.microsoft.com/zh-cn/access-help/calculate-the-difference-between-two-date-or-time-values-HP001098486.aspx - bhathiya-perera
在TotalHrs字段中,仅显示“#Error#”。 - ayha
也许可以尝试使用 Format( (MAX(H.EventTime)-MIN(H.EventTime)), "hh:mm:ss") - user554546
2个回答

3
您可以将大部分的SELECT语句移入子查询中。然后在父查询中使用子查询中定义的名称LeavingAttending来计算它们的差异。
PARAMETERS [Enter Date] DateTime;
SELECT
    sub.Emp_ID,
    sub.Attending,
    sub.Leaving,
    Format((sub.Leaving - sub.Attending), "hh:mm:ss") AS TotalHrs
FROM
    (
        SELECT
            M.CompanyID AS Emp_ID,
            MIN(H.EventTime) AS Attending,
            MAX(H.EventTime) AS Leaving
        FROM
            Member AS M
            LEFT JOIN History AS H
            ON
                M.UserID = H.EventUserID 
            AND Format([EventDate], "dd/mm/yyyy") = [Enter Date]    
        WHERE
            M.companyId NOT IN (select companyid from exceptions)
        GROUP BY
            M.CompanyID, EventDate
    ) AS sub
ORDER BY sub.Emp_ID

大部分的繁重工作都在子查询中完成。父查询仅检索子查询值并减去一对值,因此这个建议不应该对性能造成显著的额外负担。


抱歉,我在 MAX(H.EventTime) AS Leaving 后面加了一个逗号。请将其删除,以符合修订后的答案。 - HansUp
我从您的原始查询中未更改联接。您报告了该查询的不同错误,但可能是Access仅抱怨它发现的第一个错误。复制您的原始查询,从“SELECT”字段列表中丢弃“TotalHrs”表达式,并正确地使联接工作。完成后,您可以在我建议的子查询中应用相同的联接。 - HansUp
查询仍然返回TotalHrs字段中的错误。 - ayha
如果放弃“TotHrs”字段,您能否得到一个临时版本? - HansUp
除了错误差异之外,所有其他字段都填入了正确的结果,包括出席和离开。即使不丢弃totalhrs,我也可以得到其他结果。 - ayha
显示剩余3条评论

2

在查询完成之前,Leaving和Attending没有值。因此,在Jet处理查询的SELECT部分时,Leaving-Attending对其毫无意义。您需要在TotalHrs的计算中用MIN(H.EventTime)替换Attending,并用MAX(H.EventTime)替换Leaving。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接