आपको अन्य समाधानों के विपरीत समस्या को हल करने के लिए केवल एक कार्टेशियन जॉइन का उपयोग करना होगा, जो एकाधिक का उपयोग करता है। मुझे लगता है कि समय को 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 से डेटा लौटा रहा है।
यहाँ यह SQL Fiddle फ़ॉर्मैट में है ।
कम सुंदर (लेकिन छोटा) प्रारूप है:
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