データ型とそれらの違いは、ドキュメントのです。 。短いバージョンは次のとおりです:
- DATEの精度は1秒までで、タイムゾーンはサポートされていません。
- TIMESTAMPの精度は数分の1秒(小数点以下第9位までですが、オペレーティングシステムもそれに影響します)ですが、タイムゾーンはサポートされていません。
- TIMESTAMP WITH TIME ZONEは、TIMESTAMPと同じ精度ですが、名前が示すようにタイムゾーンもサポートしています。
- TIMESTAMP WITH LOCAL TIME ZONEは、作成/クエリセッションのローカルタイムゾーンとの間で保存された値を調整します。
この記事 面白いです。
データベースに格納されている日時の値を比較する場合は常に、同じデータ型の値を使用して比較する必要があります。特に列にインデックスが付けられている場合は、比較のために列のすべての値を変換する必要はありません。 DATE列がある場合は、DATEと比較します。文字列として比較したり、暗黙的な変換 文字列の。行う場合:
WHERE date_col BETWEEN '01-JAN-1990' AND '01-JAN-2000'
NLS_DATE_FORMATがDD-MON-YYYYであり、NLS_DATE_LANGUAGEが英語であることに依存しています。他の誰かが別のセッションで同じクエリを実行すると、その設定によってクエリが失敗する可能性があります(または、場合によっては、間違った結果が得られ、さらに悪化する可能性があります)。言語の問題を回避するには、名前ではなく月番号を使用することをお勧めします。比較する文字列変数がある場合は、<を使用する必要があります。 code> TO_DATE() 固定の既知のフォーマットマスクを使用して文字列をDATEに変換するには-NLSに依存しないでください。固定値がある場合は、同じことを行うか、日付リテラル 、これは短く、明確です。
使用した形式では、列が2000年1月1日の深夜に設定されている行も含まれていますが、それ以降は含まれていません。それはあなたが望むものかもしれませんが、 BETWEEN
の方法を理解していることを確認してください 動作します。 1999年12月31日の任意の時点を含め、その10年以内の日付を実際に探している場合は、次を使用できます。
WHERE date_col >= DATE '1990-01-01' AND date_col < DATE '2000-01-01'
タイムスタンプには、 TO_TIMESTAMP()<のいずれかを使用できます。 / code>
またはタイムスタンプリテラル:
WHERE ts_col >= TIMESTAMP '1990-01-01 00:00:00'
AND ts_col < TIMESTAMP '2000-01-01 00:00:00'
タイムゾーンのあるタイムスタンプの場合は、TO_TIMESTAMP_TZを使用できます。 ()
または、タイムゾーンリージョンの名前が付いたタイムスタンプリテラル:
WHERE tstz_col >= TIMESTAMP '1990-01-01 00:00:00 America/New_York'
AND tstz_col < TIMESTAMP '2000-01-01 00:00:00 America/New_York'