Wersja generate_series
używasz sygnatur czasowych, a nie dat. Więc twój '2012-10-14'
i current_date
są konwertowane na timestamp with time zone
s i generate_series
produkuje zestaw timestamp with time zone
s; porównaj te:
=> 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)
Pierwsza ma strefy czasowe, druga nie.
Ale current_date
zawsze jest konwertowany na znacznik czasu z zastosowanym dostosowaniem strefy czasowej sesji bazy danych. Sesja Railsów będzie rozmawiać z bazą danych w UTC, twój psql
sesja prawdopodobnie używa ET.
Jeśli ręcznie określisz bieżącą datę i jawnie pracujesz z timestamp
s:
select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')
wtedy uzyskasz te same siedem wyników w obu, ponieważ nie ma strefy czasowej w zasięgu wzroku, aby narobić bałaganu.
Najłatwiejszym sposobem na zignorowanie stref czasowych jest użycie liczby całkowitej generate_series
oraz fakt, że dodanie liczby całkowitej do daty traktuje tę liczbę jako liczbę dni:
select '2012-10-14'::date + generate_series(0, 6)
To da ci te same siedem dni bez ingerencji w strefę czasową. Nadal możesz używać current_date
(który nie ma strefy czasowej, ponieważ daty SQL nie mają stref czasowych), zauważając, że różnica między dwiema datami to liczba dni między nimi (liczba całkowita):
=> 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)
oraz z Railsów:
> 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"}]
BTW, nienawidzę stref czasowych, nienawidzę i pogardzam nimi.