Versi generate_series
yang Anda gunakan bekerja dengan cap waktu, bukan tanggal. Jadi '2012-10-14'
dan current_date
sedang dikonversi ke timestamp with time zone
s dan generate_series
menghasilkan satu set timestamp with time zone
s; bandingkan ini:
=> 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)
Yang pertama memiliki zona waktu, yang kedua tidak.
Tapi, current_date
selalu dikonversi ke stempel waktu dengan penyesuaian zona waktu sesi database yang diterapkan. Sesi Rails akan berbicara dengan database di UTC, psql
. Anda sesi mungkin menggunakan ET.
Jika Anda secara manual menentukan tanggal saat ini dan secara eksplisit bekerja dengan timestamp
s:
select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')
maka Anda akan mendapatkan tujuh hasil yang sama di keduanya karena tidak ada zona waktu yang terlihat untuk mengacaukan segalanya.
Cara termudah untuk mengabaikan zona waktu adalah dengan menggunakan versi integer generate_series
dan fakta bahwa menambahkan bilangan bulat ke tanggal memperlakukan bilangan bulat sebagai jumlah hari:
select '2012-10-14'::date + generate_series(0, 6)
Itu akan memberi Anda tujuh hari yang sama tanpa gangguan zona waktu. Anda masih dapat menggunakan current_date
(yang tidak memiliki zona waktu karena tanggal SQL tidak memiliki zona waktu) dengan mencatat bahwa perbedaan antara dua tanggal adalah jumlah hari di antara tanggal tersebut (bilangan bulat):
=> 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)
dan dari 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"}]
BTW, saya benci zona waktu, membenci dan membenci mereka.