Skip to content

Commit

Permalink
Fixed error around DST for group_by_week and day_start with PostgreSQL
Browse files Browse the repository at this point in the history
  • Loading branch information
ankane committed Feb 8, 2020
1 parent 3312fcc commit a786b2d
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 18 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
@@ -1,3 +1,7 @@
## 4.3.1 (unreleased)

- Fixed error around DST for `group_by_week` and `day_start` with PostgreSQL

## 4.3.0 (2019-12-26)

- Fixed error with empty results in Ruby 2.7
Expand Down
2 changes: 1 addition & 1 deletion LICENSE.txt
@@ -1,4 +1,4 @@
Copyright (c) 2013-2019 Andrew Kane
Copyright (c) 2013-2020 Andrew Kane

MIT License

Expand Down
7 changes: 2 additions & 5 deletions lib/groupdate/relation_builder.rb
Expand Up @@ -79,11 +79,8 @@ def group_clause
when :month_of_year
["EXTRACT(MONTH from #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second')::integer", time_zone]
when :week # start on Sunday, not PostgreSQL default Monday

# TODO apply time zone conversions before day subtraction?
# ["DATE_TRUNC('week', #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{week_start} day' - INTERVAL '#{day_start} second') AT TIME ZONE ? + INTERVAL '#{week_start} day' + INTERVAL '#{day_start} second'", time_zone, time_zone]

["(DATE_TRUNC('week', (#{column}::timestamptz - INTERVAL '#{week_start} day' - INTERVAL '#{day_start} second') AT TIME ZONE ?) + INTERVAL '#{week_start} day' + INTERVAL '#{day_start} second') AT TIME ZONE ?", time_zone, time_zone]
# TODO just subtract number of days from day of week like MySQL?
["DATE_TRUNC('week', #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second' - INTERVAL '#{week_start} day') AT TIME ZONE ? + INTERVAL '#{week_start} day' + INTERVAL '#{day_start} second'", time_zone, time_zone]
else
["DATE_TRUNC(?, #{column}::timestamptz AT TIME ZONE ? - INTERVAL '#{day_start} second') AT TIME ZONE ? + INTERVAL '#{day_start} second'", period, time_zone, time_zone]
end
Expand Down
30 changes: 18 additions & 12 deletions test/basic_test.rb
Expand Up @@ -79,19 +79,25 @@ def test_week_middle_of_week_with_time_zone_frequently
# before and after DST weeks
weeks = ["2013-03-03", "2013-03-10", "2013-03-17", "2013-10-27", "2013-11-03", "2013-11-10"]
weekdays = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]

weekdays.each_with_index do |week_start, i|
weeks.each do |week|
start_at = pt.parse(week) + i.days
time = start_at.dup
end_at = time + 1.week
while time < end_at
# prevent mysql error
if time.utc.to_s != "2013-03-10 02:00:00 UTC"
assert_result_date :week, start_at.strftime("%Y-%m-%d"), time.utc.to_s, true, week_start: week_start
User.delete_all
hours = [0, 1, 2, 3, 21, 22]

hours.each do |hour|
puts hour
weekdays.each_with_index do |week_start, i|
puts week_start
weeks.each do |week|
puts week
start_at = (pt.parse(week) + i.days).change(hour: hour)
time = start_at.dup
end_at = (time + 1.week).change(hour: hour)
while time < end_at
# prevent mysql error
if time.utc.to_s != "2013-03-10 02:00:00 UTC"
assert_result_date :week, start_at.strftime("%Y-%m-%d"), time.utc.to_s, true, week_start: week_start, day_start: hour
User.delete_all
end
time += 1.hour
end
time += 1.hour
end
end
end
Expand Down

0 comments on commit a786b2d

Please sign in to comment.