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

PostgreSQL:日時との間

    1-01-01 ... 1-12-31を期待していました ...しかし、PostgreSQLはそれが何を意味するのかをどのように知っているのでしょうか?

    入力文字列リテラルは、現在のセッションの設定(デフォルトではpostgressql.confの一般設定)に従って解釈されます。 却下されない限り)。特にdatestyle

    DateStylestring

    日付と時刻の値の表示形式、およびあいまいな日付入力値を解釈するためのルールを設定します。歴史的な理由から、この変数には2つの独立したコンポーネントが含まれています。出力フォーマット仕様(ISOPostgresSQL 、またはGerman )および年/月/日の注文の入力/出力仕様(DMYMDY 、またはYMD )。これらは個別に設定することも、一緒に設定することもできます。キーワードEuro およびEuropean DMYの同義語です;キーワードUSNonEuro 、およびNonEuropean MDYの同義語です 。 セクション8.5を参照してください 詳細については。組み込みのデフォルトはISO, MDYです。 、ただし、initdbは、選択したlc_timeの動作に対応する設定で構成ファイルを初期化します。 ロケール。

    (出力形式は主にlc_timeによって決定されますが 。)

    あなたの場合、切断されたタイムスタンプリテラル1-12-31 23:59:59 明らかに次のように解釈されます:

    D-MM-YY h24:mi:ss
    

    あなたが望んでいたであろう間:

    Y-MM-DD h24:mi:ss
    

    3つのオプション

    1. datestyleを設定します リテラルをあなたと同じように解釈するようにします。多分ISO, YMD

    2. to_timestamp()を使用する 他の設定に関係なく、明確に定義された方法で文字列リテラルを解釈します。はるかに良い。

       SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
      
    3. さらに良いことに、ISO8601形式を使用してください (YYYY-MM-DD )すべての日時リテラル。これは明確で、どの設定からも独立しています

       SELECT '2001-12-31 23:59:59'::timestamp;
      

    クエリの書き換え

    そもそもクエリに誤りがあります。範囲クエリの処理方法は異なります。いいね:

    SELECT d.given_on 
    FROM   documents_document d
    WHERE  EXTRACT('month' FROM d.given_on) = 1
    AND    d.given_on >= '2001-01-01 0:0'
    AND    d.given_on <  '2002-01-01 0:0'
    ORDER  BY d.created_on DESC;
    

    または、もっと簡単です:

    SELECT d.given_on 
    FROM   documents_document d
    WHERE  d.given_on >= '2001-01-01 0:0'
    AND    d.given_on <  '2001-02-01 0:0'
    ORDER  BY d.created_on DESC;
    

    PostgreSQL9.2以降の範囲タイプが興味深い場合があります。



    1. SSMSのntextまたはnvarchar(max)からすべてのテキストをどのように表示しますか?

    2. Linux /MacからAmazonEC2でMySQLに接続するにはどうすればよいですか?

    3. PostgreSQLはアクセントに影響されない照合をサポートしていますか?

    4. 列の値が明確でないすべての行を選択する方法