sql >> データベース >  >> RDS >> Oracle

OracleSQLで最も近い日付を取得する方法

    複数を使用する他のソリューションとは異なり、問題を解決するには、単一のデカルト結合を使用するだけで済みます。時間は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からデータを返します。

    ここでは、SQLFiddle形式 です。 。

    あまりきれいではない(しかし短い)フォーマットは次のとおりです:

    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. MySQLで先頭と末尾の文字を削除する方法

    2. PostgreSQLで月ごとにグループ化する方法

    3. カーソルサポートの回避策は、SQL Server ParallelDataWarehousingTDSエラーの実装機能ではありません

    4. Bツリーとハッシュテーブル