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

ローカルタイムゾーン値を含むOracleタイムスタンプ透過変換

    ローカルタイムゾーンのタイムスタンプ このように機能します。アプリケーションでタイムゾーンを操作する必要がある場合、一般的なアプローチは

    それがまさにTIMESTAMPWITH LOCAL TIME ZONE 動作します-唯一の違いは

    です

    そのため、 DBTIMEZONEを変更することはできません。 ( ALTER DATABASE SET TIME_ZONE ='...';を使用 )データベースに TIMESTAMP WITH LOCAL TIME ZONE のテーブルが含まれている場合は、データベース上で 列と列にはデータが含まれています。

    SYSTIMESTAMP データベースサーバーのオペレーティングシステムのタイムゾーンで返されます。 DBTIMEZONE ない SYSTIMESTAMPのタイムゾーン またはSYSDATE

    DBTIMEZONE TIMESTAMP WITH LOCAL TIME ZONEの内部ストレージ形式を定義します データ型の列。これを忘れてください。あなたがそれを必要とするようなユースケースを想像することはできません。

    実際、テーブルはこの選択と同等です:

    select 
       CAST(systimestamp AS timestamp(0) with local time zone) as SYSTIMESTAMP_COL,
       CAST(sysdate AS timestamp(0) with local time zone) as SYSDATE_COL,
       CAST(current_timestamp AS timestamp(0) with local time zone) as CURRENT_TIMESTAMP_COL,
       CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0) with local time zone) as DATE_COL
    from dual;
    

    CAST({タイムゾーンのない時間}とローカルタイムゾーン)を作成する場合 次に、タイムゾーン情報のない日付/時刻値をタイムゾーンのある日付/時刻値に変換しようとします。 Oracleにはタイムゾーン情報がないため、原則としてこれは不可能です。そのため、Oracleはタイムゾーンを想定しています。このようなキャストを行う場合、Oracleは常に{code> SESSIONTIMEZONEで指定されている{タイムゾーンのない時間}を考慮します。 (変換の瞬間)

    したがって、 CAST(sysdate AS timestamp(0)with local time zone)

    と同等です
    CAST(FROM_TZ(TO_TIMESTAMP(SYSDATE), SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)` 
    

    それぞれ CAST(timestamp '2017-03-15 19:02:00' AS timestamp(0)with local time zone)

    を意味します
    CAST(FROM_TZ(TIMESTAMP '2017-03-15 19:02:00', SESSIONTIMEZONE) AS TIMESTAMP(0) WITH LOCAL TIME ZONE)
    

    SYSDATEの場合 SYSDATE であるため、これは実際には間違っています。 SESSIONTIMEZONEではなく、データベースサーバーのオペレーティングシステムのタイムゾーンで指定されます。 2つ目は、結果が正しいかどうかは意図によって異なります。

    SYSTIMESTAMP 戻り値TIMESTAMPWITH TIME ZONE 、現在の SESSIONTIMEZONEから常に独立しています 。ただし、 TIMESTAMP WITH LOCAL TIME ZONEに変換する場合 もちろん、現在のローカルタイムゾーンに変換されます。 CURRENT_TIMESTAMPを使用することもできます またはSYSTIMESTAMPAT LOCAL これは多かれ少なかれ同じことをします。

    このコード

    間違っているようです。結果は次のようになります

    -- SYSTIMESTAMP_COL                   15/03/2017 16:01:14
    -- SYSDATE_COL                        15/03/2017 19:01:14
    -- CURRENT_TIMESTAMP_COL              15/03/2017 16:01:14
    -- DATE_COL                           15/03/2017 19:02:00
    

    違いはあるべき姿に見えますが、絶対値は「偽造」されているようです(またはデータベースに実際の問題があります)。



    1. NetBeanGUIでのユーザー入力に従ってireportを生成する方法

    2. SQLServer監視ツールで探すべき主な機能

    3. 子テーブル挿入のトリガーを作成すると、紛らわしいエラーが返されます

    4. SQLServerツリークエリ