Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách lấy ngày gần nhất trong Oracle sql

Bạn chỉ phải sử dụng một phép nối Descartes duy nhất để giải quyết vấn đề của bạn, không giống như các giải pháp khác, sử dụng nhiều phép toán. Tôi giả sử thời gian được lưu trữ dưới dạng VARCHAR2. Nếu nó được lưu trữ dưới dạng ngày tháng thì bạn có thể xóa các hàm TO_DATE. Nếu nó được lưu trữ dưới dạng ngày tháng (tôi thực sự khuyên bạn điều này), bạn sẽ phải xóa các phần ngày tháng

Tôi đã nói hơi dài dòng nên rõ ràng chuyện gì đang xảy ra.

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

Về cơ bản, điều này tính ra sự khác biệt tuyệt đối giữa mọi thời điểm trong T1 và T2, sau đó chọn sự khác biệt nhỏ nhất theo T2 ID; trả lại dữ liệu từ T1.

Đây là định dạng SQL Fiddle .

Định dạng kém đẹp hơn (nhưng ngắn hơn) là:

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. Kết nối với cơ sở dữ liệu Oracle với Node.js Windows

  2. Perl DBI Error Msg:Không thể gọi phương thức selectcol_arrayref trên một giá trị không xác định

  3. PLS-00306:sai số hoặc loại đối số trong lệnh gọi đến 'OUTPUT_ARRAY'

  4. Cách thay đổi ngôn ngữ cho phiên Oracle của bạn

  5. Bản cập nhật SQL có ảnh hưởng đến truy vấn con của nó trong quá trình chạy cập nhật không?