sql >> Database teknologi >  >> RDS >> Oracle

Sådan får du de nærmeste datoer i Oracle sql

Du skal kun bruge en enkelt kartesisk join for at løse dit problem i modsætning til de andre løsninger, som bruger flere. Jeg antager, at tiden er gemt som en VARCHAR2. Hvis den er gemt som en dato, kan du fjerne TO_DATE-funktionerne. Hvis den er gemt som en dato (det vil jeg varmt anbefale), bliver du nødt til at fjerne dadelportionerne

Jeg har gjort det lidt udførligt, så det er tydeligt, hvad der foregår.

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

Grundlæggende beregner dette den absolutte forskel mellem hver gang i T1 og T2 og vælger derefter den mindste forskel ved T2 ID; returnerer dataene fra T1.

Her er den i SQL Fiddle-format .

Det mindre smukke (men kortere) format er:

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


  1. Oracle SQL flet flere rækker med samme id, men ude af rækkefølge-identifikatorer

  2. hvad er den rigtige måde at konvertere mellem mysql datetime og python timestamp?

  3. Sådan konverteres en krydstabuleringsforespørgsel tilbage til en normal forespørgsel i Access

  4. MariaDB JSON_REMOVE() Forklaret