Phiên bản của generate_series
mà bạn đang sử dụng đang hoạt động với dấu thời gian, không phải ngày. Vì vậy, '2012-10-14'
của bạn và current_date
đang được chuyển đổi thành timestamp with time zone
s và generate_series
đang tạo một bộ timestamp with time zone
S; so sánh những điều này:
=> 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)
Cái đầu tiên có múi giờ, cái thứ hai thì không.
Nhưng, current_date
luôn được chuyển đổi thành dấu thời gian với điều chỉnh múi giờ của phiên cơ sở dữ liệu được áp dụng. Phiên Rails sẽ nói chuyện với cơ sở dữ liệu trong UTC, psql
của bạn phiên có thể đang sử dụng ET.
Nếu bạn chỉ định ngày hiện tại theo cách thủ công và làm việc rõ ràng với timestamp
s:
select generate_series('2012-10-14'::timestamp, '2012-10-20'::timestamp, '1 day')
thì bạn sẽ nhận được bảy kết quả giống nhau ở cả hai vì không có múi giờ nào trong tầm nhìn để làm cho mọi thứ trở nên lộn xộn.
Cách dễ nhất để bỏ qua múi giờ là sử dụng phiên bản số nguyên của generate_series
và thực tế là việc thêm một số nguyên vào một ngày sẽ coi số nguyên là một số ngày:
select '2012-10-14'::date + generate_series(0, 6)
Điều đó sẽ cung cấp cho bạn bảy ngày tương tự mà không có sự can thiệp của múi giờ. Bạn vẫn có thể sử dụng current_date
(không có múi giờ vì ngày trong SQL không có múi giờ) bằng cách lưu ý rằng sự khác biệt giữa hai ngày là số ngày giữa chúng (một số nguyên):
=> 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)
và từ 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, tôi ghét múi giờ, ghét và coi thường chúng.