2017-03-02 202 views
0

之间我有一个表像这样SQL查询 - 查找日期和时间

| 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 | 
+----------+------------------+------------------+ 

我想找到的插图中的记录。

我的表有100多条记录。

例:

  1. 检查EMPID - 希望同
  2. 然后检查日期&时间,在第一个值开始于10和20时结束,并在第二个记录开始于8月底和同时在20。所以第一个记录结束时间要与第二记录结束时间(其间日期&时间)

输出这样的替换:

| 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 |     | 
+----------+------------------+------------------+------------------+ 
+0

到目前为止您尝试了什么 –

回答

0

假设你真的想取代第1记录结束的时间与第2纪录启动时间,因为你在你想要的输出显示,并且还假定共享相同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添加列使用后续条目的开始时间。使用左连接来保留没有后续行的行