Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да получите най-близките дати в Oracle sql

Трябва да използвате само едно декартово съединение, за да решите проблема си, за разлика от другите решения, които използват множество. Предполагам, че времето се съхранява като 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да поставя стойности по подразбиране за всяка колона в таблицата?

  2. Защо получавам грешка java.lang.AbstractMethodError:oracle.jdbc.driver.OracleConnection?

  3. Параметри на Oracle с IN изявление?

  4. Извършване на групови актуализации със съхранени процедури MyBatis и Oracle

  5. Изтриване на таблица в Oracle SQL