ローカルタイムゾーンにタイムスタンプを格納するタイプ「DATE」の列を持つOracleデータベースがあります。 UTCタイムゾーンのタイムスタンプでこの列をクエリする必要があります。
UTCタイムスタンプでクエリを実行するときに使用できるインデックスを列に作成するにはどうすればよいですか?また、クエリをフォーマットする方法は?
正確には、 date
タイプは、「ローカルタイムゾーン」ではなく、タイムスタンプタイムゾーン情報なしを格納します。
UTCタイムスタンプでクエリを実行するときに使用できるインデックスを列に作成するにはどうすればよいですか?また、クエリをフォーマットする方法は?
3つのオプションがあります。
クエリ時にdate
にインデックスを付け、timestamp
をdate
に変換します。例:
select * from foo where foo_date=cast(systimestamp as date) from dual;
date
にtimestamp 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である「正午」とは対照的です。)