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"}]
ところで、私はタイムゾーンを嫌い、嫌いで軽蔑しています。