Sie müssen nur eine einzige kartesische Verknüpfung verwenden, um Ihr Problem zu lösen, im Gegensatz zu den anderen Lösungen, die mehrere verwenden. Ich nehme an, die Zeit wird als VARCHAR2 gespeichert. Wenn es als Datum gespeichert ist, können Sie die TO_DATE-Funktionen entfernen. Wenn es als Datum gespeichert ist (ich würde dies sehr empfehlen), müssen Sie die Datumsteile entfernen
Ich habe es etwas ausführlicher gemacht, damit es offensichtlich ist, was los ist.
select *
from ( select id, tm
, rank() over ( partition by t2id order by difference asc ) as rnk
from ( select t1.*, t2.id as t2id
, abs( to_date(t1.tm, 'hh24:mi:ss')
- to_date(t2.tm, 'hh24:mi:ss')) as difference
from t1
cross join t2
) a
)
where rnk = 1
Grundsätzlich berechnet dies die absolute Differenz zwischen jedem Zeitpunkt in T1 und T2 und wählt dann die kleinste Differenz nach T2 ID
aus; Rückgabe der Daten von T1.
Hier ist es im SQL Fiddle-Format .
Das weniger hübsche (aber kürzere) Format ist:
select *
from ( select t1.*
, rank() over ( partition by t2.id
order by abs(to_date(t1.tm, 'hh24:mi:ss')
- to_date(t2.tm, 'hh24:mi:ss'))
) as rnk
from t1
cross join t2
) a
where rnk = 1