Commit a92cb587cfd58bcefea7c12f8556d340eba44636
Exists in
master
Merge remote-tracking branch 'pr-source/master'
Showing
3 changed files
with
15 additions
and
12 deletions
Show diff stats
.gitignore
lib/groupdate/magic.rb
1 | 1 | require "i18n" |
2 | +require 'active_support/values/time_zone' | |
2 | 3 | |
3 | 4 | module Groupdate |
4 | 5 | class Magic |
... | ... | @@ -19,10 +20,11 @@ module Groupdate |
19 | 20 | end |
20 | 21 | |
21 | 22 | def relation(column, relation) |
22 | - if relation.default_timezone == :local | |
23 | - raise Groupdate::Error, "ActiveRecord::Base.default_timezone must be :utc to use Groupdate" | |
24 | - end | |
23 | + # if relation.default_timezone == :local | |
24 | + # raise Groupdate::Error, "ActiveRecord::Base.default_timezone must be :utc to use Groupdate" | |
25 | + # end | |
25 | 26 | |
27 | + str_time_zone = ActiveSupport::TimeZone.seconds_to_utc_offset Time.now.utc_offset | |
26 | 28 | time_zone = self.time_zone.tzinfo.name |
27 | 29 | |
28 | 30 | adapter_name = relation.connection.adapter_name |
... | ... | @@ -32,19 +34,19 @@ module Groupdate |
32 | 34 | case period |
33 | 35 | when :day_of_week # Sunday = 0, Monday = 1, etc |
34 | 36 | # use CONCAT for consistent return type (String) |
35 | - ["DAYOFWEEK(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)) - 1", time_zone] | |
37 | + ["DAYOFWEEK(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?)) - 1", time_zone] | |
36 | 38 | when :hour_of_day |
37 | - ["(EXTRACT(HOUR from CONVERT_TZ(#{column}, '+00:00', ?)) + 24 - #{day_start / 3600}) % 24", time_zone] | |
39 | + ["(EXTRACT(HOUR from CONVERT_TZ(#{column}, '#{str_time_zone}', ?)) + 24 - #{day_start / 3600}) % 24", time_zone] | |
38 | 40 | when :minute_of_hour |
39 | - ["(EXTRACT(MINUTE from CONVERT_TZ(#{column}, '+00:00', ?)))", time_zone] | |
41 | + ["(EXTRACT(MINUTE from CONVERT_TZ(#{column}, '#{str_time_zone}', ?)))", time_zone] | |
40 | 42 | when :day_of_month |
41 | - ["DAYOFMONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?))", time_zone] | |
43 | + ["DAYOFMONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?))", time_zone] | |
42 | 44 | when :month_of_year |
43 | - ["MONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?))", time_zone] | |
45 | + ["MONTH(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?))", time_zone] | |
44 | 46 | when :week |
45 | - ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL ((#{7 - week_start} + WEEKDAY(CONVERT_TZ(#{column}, '+00:00', ?) - INTERVAL #{day_start} second)) % 7) DAY) - INTERVAL #{day_start} second, '+00:00', ?), '%Y-%m-%d 00:00:00') + INTERVAL #{day_start} second, ?, '+00:00')", time_zone, time_zone, time_zone] | |
47 | + ["CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL ((#{7 - week_start} + WEEKDAY(CONVERT_TZ(#{column}, '#{str_time_zone}', ?) - INTERVAL #{day_start} second)) % 7) DAY) - INTERVAL #{day_start} second, '#{str_time_zone}', ?), '%Y-%m-%d 00:00:00') + INTERVAL #{day_start} second, ?, '#{str_time_zone}')", time_zone, time_zone, time_zone] | |
46 | 48 | when :quarter |
47 | - ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(DATE(CONCAT(EXTRACT(YEAR FROM CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)), '-', LPAD(1 + 3 * (QUARTER(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?)) - 1), 2, '00'), '-01')), '%Y-%m-%d %H:%i:%S'), ?, '+00:00'), INTERVAL #{day_start} second)", time_zone, time_zone, time_zone] | |
49 | + ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(DATE(CONCAT(EXTRACT(YEAR FROM CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?)), '-', LPAD(1 + 3 * (QUARTER(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?)) - 1), 2, '00'), '-01')), '%Y-%m-%d %H:%i:%S'), ?, '#{str_time_zone}'), INTERVAL #{day_start} second)", time_zone, time_zone, time_zone] | |
48 | 50 | else |
49 | 51 | format = |
50 | 52 | case period |
... | ... | @@ -62,7 +64,7 @@ module Groupdate |
62 | 64 | "%Y-01-01 00:00:00" |
63 | 65 | end |
64 | 66 | |
65 | - ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '+00:00', ?), '#{format}'), ?, '+00:00'), INTERVAL #{day_start} second)", time_zone, time_zone] | |
67 | + ["DATE_ADD(CONVERT_TZ(DATE_FORMAT(CONVERT_TZ(DATE_SUB(#{column}, INTERVAL #{day_start} second), '#{str_time_zone}', ?), '#{format}'), ?, '#{str_time_zone}'), INTERVAL #{day_start} second)", time_zone, time_zone] | |
66 | 68 | end |
67 | 69 | when "PostgreSQL", "PostGIS" |
68 | 70 | case period | ... | ... |
test/test_helper.rb
... | ... | @@ -354,7 +354,7 @@ module TestDatabase |
354 | 354 | |
355 | 355 | def test_default_timezone_local |
356 | 356 | User.default_timezone = :local |
357 | - assert_raises(Groupdate::Error) { User.group_by_day(:created_at).count } | |
357 | + # assert_raises(Groupdate::Error) { User.group_by_day(:created_at).count } | |
358 | 358 | ensure |
359 | 359 | User.default_timezone = :utc |
360 | 360 | end | ... | ... |