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

PostgreSQLでサポートされている最も古いタイムスタンプ

    マニュアルには値が記載されています として:

    • 低い値:紀元前4713年
    • 高い値:294276 AD

    クリスが指摘したように、-infinity もサポートされています。

    を参照してください マニュアルの同じページの後半。上記は、整数のタイムスタンプを使用している場合にのみ当てはまります。 、これは、漠然と最近のすべてのバージョンのPostgreSQLのデフォルトです。疑わしい場合:

    SHOW integer_datetimes;
    

    教えてくれます。代わりに浮動小数点日時を使用している場合は、範囲が広くなり、精度が低くなります(非線形)。プログラムで最小値を計算しようとすると、その制限に対処する必要があります。

    PostgreSQLでは、タイムスタンプにゼロをキャストして可能な限り最小のタイムスタンプを取得するだけでなく、浮動小数点の日時を使用している場合、これはあまり意味がありません。 できます ユリウス日変換関数を使用しますが、これによりエポックが得られます。 最小時間ではありません :

    postgres=> select to_timestamp(0);
          to_timestamp      
    ------------------------
     1970-01-01 08:00:00+08
    (1 row)
    

    負の値を受け入れるためです。負のマキシントを与えることはうまくいくと思うかもしれませんが、結果は驚くべきものであり、ここにラップアラウンドバグが潜んでいるのではないかと思います:

    postgres=> select to_timestamp(-922337203685477);
              to_timestamp           
    ---------------------------------
     294247-01-10 12:00:54.775808+08
    (1 row)
    
    postgres=> select to_timestamp(-92233720368547);
              to_timestamp           
    ---------------------------------
     294247-01-10 12:00:54.775808+08
    (1 row)
    
    postgres=> select to_timestamp(-9223372036854);
             to_timestamp         
    ------------------------------
     294247-01-10 12:00:55.552+08
    (1 row)
    
    postgres=> select to_timestamp(-922337203685);
    ERROR:  timestamp out of range
    postgres=> select to_timestamp(-92233720368);
              to_timestamp           
    ---------------------------------
     0954-03-26 09:50:36+07:43:24 BC
    (1 row)
    
    postgres=> select to_timestamp(-9223372036);
             to_timestamp         
    ------------------------------
     1677-09-21 07:56:08+07:43:24
    (1 row)
    

    (おそらく、最近のタイムスタンプは整数として格納されていますが、to_timestampが2倍になるという事実に関連していますか?)

    タイムスタンプの範囲を、エラーが発生しない任意のタイムスタンプにするのがおそらく最も賢明だと思います。結局のところ、有効なタイムスタンプの範囲は連続的ではありません:

    postgres=> SELECT TIMESTAMP '2000-02-29';
          timestamp      
    ---------------------
     2000-02-29 00:00:00
    (1 row)
    
    postgres=> SELECT TIMESTAMP '2001-02-29';
    ERROR:  date/time field value out of range: "2001-02-29"
    LINE 1: SELECT TIMESTAMP '2001-02-29';
    

    したがって、値が2つの有効なタイムスタンプの間にあるという理由だけで、それが自己有効であると想定することはできません。



    1. OracleDatabaseのFORALLステートメントの概要

    2. 大文字と小文字を区別するようにMysqlテーブルの列を変更する

    3. SQLiteとデータベースの初期化

    4. SQL Serverで「datetime2」を「datetimeoffset」に変換します(T-SQLの例)