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

SQL- TIMESTAMP、DATE、およびTIMEZONEを使用したTIMESTAMPの違いは?

    データ型とそれらの違いは、ドキュメントのです。 。短いバージョンは次のとおりです:

    • 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'
    


    1. Apache Cayenne / PostgreSQL:クライアントが多すぎてすでにエラーが発生しています

    2. PHPなしでMySQLデータベースと対話することは可能ですか?

    3. PostgresENUMデータ型またはCHECKCONSTRAINT?

    4. ソケットを介してローカルMySQLサーバーに接続します