Sql Query for Ms access数据库

时间:2012-09-17 05:29:58

标签: sql ms-access

下面是ms访问中的表结构,

SNo    Time        EmpId    Date      Type
-------------------------------------------
  1   09:20:53 AM    1     9/12/2012  IN      
  2   09:50:12 AM    1     9/12/2012  OUT 
  3   09:52:09 AM    1     9/12/2012  IN
  4   12:15:10 PM    1     9/12/2012  OUT

输出应比较时间并找到前两行和下两行(第3和第4行)的差异 需要的输出是,

EmpId   Date          Time
 1     9/12/2012     0:30:41
 1     9/12/2012     2:23:01

有人可以请你帮忙。真的很感激,谢谢。

1 个答案:

答案 0 :(得分:0)

我认为此查询接近您的要求,假设您的DateTime字段都是日期/时间数据类型。如果它们实际上是文本类型,则可以使用CDate()转换其值。但无论哪种方式,我认为使用单个字段来保存两者日期和时间而不是为每个字段分别显示一个查询会更容易。

SELECT
    sub.SNo,
    sub.EmpId,
    sub.Type,
    sub.start_time,
    sub.end_time,
    Format(sub.end_time - sub.start_time, 'h:nn:ss') AS duration
FROM
    (
        SELECT
            o.SNo,
            o.Date + o.Time AS end_time,
            o.EmpId,
            o.Type,
            (
                SELECT TOP 1 i.Date + i.Time
                FROM YourTable AS i
                WHERE
                        i.Type = 'IN'
                    AND i.EmpId = o.EmpId
                    AND i.Date + i.Time < o.Date + o.Time
                ORDER BY i.Date, i.Time DESC
            ) AS start_time
        FROM YourTable AS o
        WHERE o.Type='OUT'
    ) AS sub;

BTW,DateTimeType是保留字,因此不是字段名称的理想选择。虽然这些名称不是此查询的交易破坏者,但如果可能,您可以通过重命名这些字段来避免其他潜在的麻烦。