複数を使用する他のソリューションとは異なり、問題を解決するには、単一のデカルト結合を使用するだけで済みます。時間はVARCHAR2として保存されていると思います。日付として保存されている場合は、TO_DATE関数を削除できます。日付として保存されている場合(これを強くお勧めします)、日付部分を削除する必要があります
少し冗長にしたので、何が起こっているのかは明らかです。
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
基本的に、これはT1とT2のすべての時間の絶対差を計算し、T2 ID
によって最小の差を選択します。; T1からデータを返します。
ここでは、SQLFiddle形式 です。 。
あまりきれいではない(しかし短い)フォーマットは次のとおりです:
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