SQL查询 - 在日期和时间之间查找

时间:2017-03-02 06:37:32

标签: mysql access-vba

我有一张这样的表

|  EmpId   |  InTime          | OutTime          |
+----------+------------------+------------------+
|      101 | 01/02/2009 10:00 | 01/02/2009 20:00 |
|      101 | 01/02/2009 18:00 | 01/02/2009 20:00 |
|      102 | 01/02/2009  2:00 | 01/02/2009  2:00 |
|      103 | 01/02/2009  2:00 | 01/02/2009  5:00 |
|      104 | 01/02/2009  3:03 | 01/02/2009  5:00 |
|      104 | 01/02/2009  3:45 | 01/02/2009  7:00 |
|      105 | 01/02/2009 10:00 | 01/02/2009 22:00 |           
|      106 | 01/02/2009  3:00 | 01/02/2009  4:00 | 
|      106 | 01/02/2009  3:58 | 01/02/2009  4:10 | 
+----------+------------------+------------------+

我想找到中间记录。

我的桌子有超过10万条记录。

例如:

  1. 检查Empid - 想要一样
  2. 然后检查日期&时间,第一个值从10开始到20结束,第二个记录从8开始,到20结束。因此,第一记录结束时间要替换为第二记录结束时间(在日期和时间之间)
  3. 输出如下:

    | EmpId    |  StartTime       | EndTime          | EndTime1         |   
    +----------+------------------+------------------+------------------+
    |      101 | 01/02/2009 10:00 | 01/02/2009 20:00 |01/02/2009 18:00  |
    |      101 | 01/02/2009 18:00 | 01/02/2009 20:00 |                  |
    |      102 | 01/02/2009  2:00 | 01/02/2009  2:00 |                  |
    |      103 | 01/02/2009  2:00 | 01/02/2009  5:00 |                  |
    |      104 | 01/02/2009  3:03 | 01/02/2009  5:00 |01/02/2009  3:45  |
    |      104 | 01/02/2009  3:45 | 01/02/2009  7:00 |                  |
    |      105 | 01/02/2009 10:00 | 01/02/2009 22:00 |                  |
    |      106 | 01/02/2009  3:00 | 01/02/2009  4:00 | 01/02/2009  3:58 |
    |      106 | 01/02/2009  3:58 | 01/02/2009  4:10 |                  |
    +----------+------------------+------------------+------------------+
    

1 个答案:

答案 0 :(得分:0)

假设您实际上想要将第一个记录结束时间替换为第二个记录开始时间,因为您在所需的输出中显示并且还假设共享相同empid的所有行都重叠,我认为一个解决方案就像这样简单:

    select empid, t1.intime starttime, t2.intime endtime t1.outtime endtime1 
    from table_name t1 
    left outer join table_name t2 on t1.empid = t2.empid and t1.intime < t2.intime order by 1,2;

使用selfjoin添加列具有后继条目的开始时间。使用左连接来保留没有后继者的行