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

Rails / Postgresql SQLの違い(日付付き)

    generate_seriesのバージョン 使用しているのは、日付ではなくタイムスタンプを使用しています。つまり、'2012-10-14' およびcurrent_date タイムゾーン付きのtimestamp with time zoneに変換されます sおよびgenerate_series タイムゾーン付きのtimestamp with time zoneを作成しています s;これらを比較してください:

    => select generate_series('2012-10-14', current_date, '1 day');
        generate_series     
    ------------------------
     2012-10-14 00:00:00-07
     2012-10-15 00:00:00-07
     2012-10-16 00:00:00-07
     2012-10-17 00:00:00-07
     2012-10-18 00:00:00-07
     2012-10-19 00:00:00-07
     2012-10-20 00:00:00-07
    (7 rows)
    
    => select generate_series('2012-10-14', current_date::timestamp, '1 day');
       generate_series   
    ---------------------
     2012-10-14 00:00:00
     2012-10-15 00:00:00
     2012-10-16 00:00:00
     2012-10-17 00:00:00
     2012-10-18 00:00:00
     2012-10-19 00:00:00
     2012-10-20 00:00:00
    (7 rows)
    

    1つ目はタイムゾーンがあり、2つ目はタイムゾーンがありません。

    ただし、current_date データベースセッションのタイムゾーン調整が適用されたタイムスタンプに常に変換されます。 Railsセッションは、UTCでデータベースと通信します。psql セッションはおそらくETを使用しています。

    現在の日付を手動で指定し、timestampを明示的に操作する場合 s:

    select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')
    

    そうすれば、物事を台無しにするタイムゾーンが見えないため、両方で同じ7つの結果が得られます。

    タイムゾーンを無視する最も簡単な方法は、整数バージョンのgenerate_seriesを使用することです。 日付に整数を追加すると、整数が日数として扱われるという事実:

    select '2012-10-14'::date + generate_series(0, 6)
    

    これにより、タイムゾーンの干渉なしに同じ7日間が得られます。 current_dateは引き続き使用できます (SQLの日付にはタイムゾーンがないため、タイムゾーンはありません)2つの日付の違いは、それらの間の日数(整数)であることに注意してください:

    => select '2012-10-14'::date + generate_series(0, current_date - '2012-10-14');
      ?column?  
    ------------
     2012-10-14
     2012-10-15
     2012-10-16
     2012-10-17
     2012-10-18
     2012-10-19
     2012-10-20
    (7 rows)
    

    およびRailsから:

    > pp ActiveRecord::Base.connection.execute("select '2012-10-14'::date + generate_series(0, 6)").to_a
    [{"?column?"=>"2012-10-14"},
     {"?column?"=>"2012-10-15"},
     {"?column?"=>"2012-10-16"},
     {"?column?"=>"2012-10-17"},
     {"?column?"=>"2012-10-18"},
     {"?column?"=>"2012-10-19"},
     {"?column?"=>"2012-10-20"}]
    

    ところで、私はタイムゾーンを嫌い、嫌いで軽蔑しています。




    1. OracleのFLOOR()関数

    2. IRIWorkbenchでのインクリメンタルデータレプリケーション

    3. 不完全なリカバリ後にデータベースが一貫していることを確認する方法

    4. 死ぬことのないゾンビPerfMonカウンター!