sql >> Database >  >> RDS >> Oracle

Hoe u de dichtstbijzijnde datums kunt krijgen in Oracle sql

U hoeft slechts een enkele Cartesiaanse join te gebruiken om uw probleem op te lossen, in tegenstelling tot de andere oplossingen, die meerdere gebruiken. Ik neem aan dat tijd wordt opgeslagen als een VARCHAR2. Als het als een datum is opgeslagen, kunt u de TO_DATE-functies verwijderen. Als het is opgeslagen als een datum (ik zou dit ten zeerste aanbevelen), moet u de datumgedeelten verwijderen

Ik heb het een beetje uitgebreid gemaakt, zodat het duidelijk is wat er aan de hand is.

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

Kortom, dit berekent het absolute verschil tussen elke keer in T1 en T2 en kiest vervolgens het kleinste verschil op T2 ID; het retourneren van de gegevens van T1.

Hier is het in SQL Fiddle-formaat .

Het minder mooie (maar kortere) formaat is:

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. Weet iemand welke coderingstechniek JDeveloper/SQL Developer gebruikt om inloggegevens te behouden?

  2. tinyint (maat), varchar (maat):uitleg over de maat

  3. geen privileges op tablespace 'USERS'

  4. Linux-shellscript voor databaseback-up