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

OracleでTIMESTAMP形式の値の違いを見つける方法は?

    タイムスタンプ演算の結果は、INTERVALデータ型です。そこに2番目の間隔の日があります...

    1つの方法で分数が必要な場合は、EXTRACT()を使用します。 、例:

    select extract( minute from interval_difference ) * 60 
            + extract( hour from interval_difference ) * 60
            + extract( day from interval_difference ) * 60 * 24
      from ( select systimestamp - (systimestamp - 1) as interval_difference
               from dual )
    

    または、日付を使ってトリックを使用することもできます:

    select sysdate + (interval_difference * 1440) - sysdate
      from (select systimestamp - (systimestamp - 1) as interval_difference
              from dual )
    

    「トリック」バージョンは、演算子の優先順位と、日付とタイムスタンプの算術の違いのために機能します。

    最初の操作は次のようになります:

    date + ( interval * number ) - date
    

    ドキュメントに記載されているように:

    Oracleは、括弧内の式を評価してから、外側の式を評価します。

    したがって、最初の操作は、間隔に1,440を掛けるためにそれを実行しました。間隔、つまり離散期間に数値を掛けたものは、別の離散期間です。日時と区間演算に関するドキュメントを参照してください。したがって、この操作の結果は間隔になり、次のようになります。

    date + interval - date
    

    ここでは、プラス演算子がマイナスよりも優先されます。これは、間隔から日付を引いたものが無効な操作であることが原因である可能性がありますが、ドキュメントには、これが当てはまることが示されています(出てこないでください)。したがって、最初に実行される操作は日付+間隔です。日付と間隔は日付です。そのままにしておく

    date - date
    

    ドキュメントによると、これは日数を表す整数になります。ただし、元の間隔に1,440を掛けたため、これは、そうでない場合の日数の1,440倍になります。その後、秒数が残ります。

    注目に値する:

    間隔の計算で日時の値が返される場合、結果は実際の日時の値である必要があります。そうでない場合、データベースはエラーを返します。たとえば、次の2つのステートメントはエラーを返します。

    「トリック」メソッドは 失敗することはめったにありませんが、それでも失敗します。いつものように、それを適切に行うのが最善です。



    1. ラッパークラスの機能変換

    2. JulianDay()関数がSQLiteでどのように機能するか

    3. ネストされたトランザクションはMySQLで許可されていますか?

    4. SQLでの二重コロン(::)表記