web-dev-qa-db-ja.com

Oracleで「DATE」タイプの列からUTCインデックスを作成するにはどうすればよいですか?

ローカルタイムゾーンにタイムスタンプを格納するタイプ「DATE」の列を持つOracleデータベースがあります。 UTCタイムゾーンのタイムスタンプでこの列をクエリする必要があります。

UTCタイムスタンプでクエリを実行するときに使用できるインデックスを列に作成するにはどうすればよいですか?また、クエリをフォーマットする方法は?

1
Nakedible

正確には、 date タイプは、「ローカルタイムゾーン」ではなく、タイムスタンプタイムゾーン情報なしを格納します。

UTCタイムスタンプでクエリを実行するときに使用できるインデックスを列に作成するにはどうすればよいですか?また、クエリをフォーマットする方法は?

3つのオプションがあります。

  • クエリ時にdateにインデックスを付け、timestampdateに変換します。例:

    select * from foo where foo_date=cast(systimestamp as date) from dual;
    
  • datetimestamp with local time zoneに変換された機能インデックスを作成します。例:

    create unique index i_foo on foo(cast(ts as timestamp with local time zone));
    select * from foo where cast(ts as timestamp with local time zone)=
                            cast(X as timestamp with local time zone);
    
  • タイプdateの列のタイプをtimestamp with time zoneまたはtimestamp with local time zoneに変更します

これらのうち、最後のオプションが最適である可能性が非常に高くなります。timestamp with local time zoneは、特定の時点を参照するほとんどのデータの「正しい」タイプです。 (どのタイムゾーンにいても常に12:00である「正午」とは対照的です。)