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

Oracleの日付の減算-数値または間隔のデータ型?

    わかりました。通常、私は自分の質問に答えませんが、少しいじくり回した後、OracleがDATE減算の結果をどのように格納するかを明確に理解しました。

    2つの日付を引くと、その値はNUMBERデータ型ではなくなります(Oracle 11.2 SQLリファレンスマニュアルで信じられているように)。 DATE減算の内部データ型番号は14であり、これは文書化されていない内部データ型です(NUMBERは内部データ型番号2です)。ただし、実際には2つの補数の符号付き数値として格納され、最初の4バイトは日数を表し、最後の4バイトは秒数を表します。

    正の整数差をもたらすDATE減算の例:

    select date '2009-08-07' - date '2008-08-08' from dual;
    

    結果:

    DATE'2009-08-07'-DATE'2008-08-08'
    ---------------------------------
                                  364
    
    select dump(date '2009-08-07' - date '2008-08-08') from dual;
    
    DUMP(DATE'2009-08-07'-DATE'2008
    -------------------------------
    Typ=14 Len=8: 108,1,0,0,0,0,0,0
    

    結果は、2の補数の符号付き4バイト数として表されることを思い出してください。この場合(正確には364日と0時間)、小数点がないため、最後の4バイトはすべて0であり、無視できます。最初の4バイトについては、私のCPUはリトルエンディアンアーキテクチャであるため、バイトは逆になり、1,108または0x16c(10進数の364)として読み取る必要があります。

    負の整数の差が生じるDATE減算の例:

    select date '1000-08-07' - date '2008-08-08' from dual;
    

    結果:

    DATE'1000-08-07'-DATE'2008-08-08'
    ---------------------------------
                              -368160
    
    select dump(date '1000-08-07' - date '2008-08-08') from dual;
    
    DUMP(DATE'1000-08-07'-DATE'2008-08-0
    ------------------------------------
    Typ=14 Len=8: 224,97,250,255,0,0,0,0
    

    繰り返しになりますが、私はリトルエンディアンマシンを使用しているため、バイトが逆になり、11111111 11111010 01100001 11011111に対応する255,250,97,224として読み取る必要があります。これは2の補数の符号付き2進数エンコーディングであるため、数値は次のようになります。左端の2進数が1であるため、負の値になります。これを10進数に変換するには、2の補数を逆にする必要があります(1を引いてから、1の補数を実行します)。 P>

    小数の差が生じるDATE減算の例:

    select to_date('08/AUG/2004 14:00:00', 'DD/MON/YYYY HH24:MI:SS'
     - to_date('08/AUG/2004 8:00:00', 'DD/MON/YYYY HH24:MI:SS') from dual;
    
    TO_DATE('08/AUG/200414:00:00','DD/MON/YYYYHH24:MI:SS')-TO_DATE('08/AUG/20048:00:
    --------------------------------------------------------------------------------
                                                                                 .25
    

    これら2つの日付の違いは、0。25日または6時間です。

    select dump(to_date('08/AUG/2004 14:00:00', 'DD/MON/YYYY HH24:MI:SS')
     - to_date('08/AUG/2004 8:00:00', 'DD/MON/YYYY HH24:MI:SS')) from dual;
    
    DUMP(TO_DATE('08/AUG/200414:00:
    -------------------------------
    Typ=14 Len=8: 0,0,0,0,96,84,0,0
    

    今回は、差が0日と6時間であるため、最初の4バイトは0であると予想されます。最後の4バイトについては、それらを逆にして(CPUはリトルエンディアンであるため)、84,96=01010100を取得できます。 01100000ベース2=10進数で21600。 21600秒を時間に変換すると、6時間になります。これは、予想した差です。

    これが、DATE減算が実際にどのように格納されるのか疑問に思っていた人に役立つことを願っています。



    1. INSERTINTOとSELECTINTO

    2. where句のサブクエリの2つの列

    3. SQL ServerのDateTimeオブジェクトをBIGINT(.Netティック)に変換します

    4. Android-2つのテーブルに関連するデータをコンテンツプロバイダーの挿入メソッドに渡すにはどうすればよいですか?