2017-03-02 6 views
0

Ich habe eine Tabelle wie dieseSQL Abfrage- findet zwischen Datum und Zeit

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

ich die zwischen Aufzeichnungen finden möchte.

Meine Tabelle hat über 100k Datensätze.

Ex:

  1. EmpID prüfen - wollen gleiche
  2. Dann das Datum & Zeit prüfen sein, in ersten Wert bei 10 beginnen und am 20. und in dem 2. Aufzeichnungsstart bei 8 und Ende Ende um 20 Uhr gleichzeitig. so erste Rekord Endzeit mit zweiten Rekord Endzeit ersetzen möchten (Inbetween Datum & Zeit)

Ausgabe wie folgt aus:

| 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

was haben Sie bisher versucht –

Antwort

0

unter der Annahme, dass Sie tatsächlich erste Rekord Endzeit mit 2. Datensatz ersetzen möchten Startzeit, wie Sie in Ihrem gewünschten Ausgang zeigen und auch davon aus, dass alle Zeilen, die die gleiche empid gemeinsam nutzen, werden überlappende ich eine Lösung denken, wie dies so einfach wäre:

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; 

ein selfjoin Verwenden Hinzufügen der Spalte mit Startzeit des Nachfolgereintrags. Verwenden Sie eine linke Verknüpfung, um Zeilen ohne Nachfolger zu behalten