Commit a92cb587cfd58bcefea7c12f8556d340eba44636

Authored by Tao Huang
2 parents 2d2bbe71 42327cd3
Exists in master

Merge remote-tracking branch 'pr-source/master'

1 *.gem 1 *.gem
  2 +.idea
2 *.rbc 3 *.rbc
3 .bundle 4 .bundle
4 .config 5 .config
lib/groupdate/magic.rb
1 require "i18n" 1 require "i18n"
  2 +require 'active_support/values/time_zone'
2 3
3 module Groupdate 4 module Groupdate
4 class Magic 5 class Magic
@@ -19,10 +20,11 @@ module Groupdate @@ -19,10 +20,11 @@ module Groupdate
19 end 20 end
20 21
21 def relation(column, relation) 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 time_zone = self.time_zone.tzinfo.name 28 time_zone = self.time_zone.tzinfo.name
27 29
28 adapter_name = relation.connection.adapter_name 30 adapter_name = relation.connection.adapter_name
@@ -32,19 +34,19 @@ module Groupdate @@ -32,19 +34,19 @@ module Groupdate
32 case period 34 case period
33 when :day_of_week # Sunday = 0, Monday = 1, etc 35 when :day_of_week # Sunday = 0, Monday = 1, etc
34 # use CONCAT for consistent return type (String) 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 when :hour_of_day 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 when :minute_of_hour 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 when :day_of_month 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 when :month_of_year 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 when :week 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 when :quarter 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 else 50 else
49 format = 51 format =
50 case period 52 case period
@@ -62,7 +64,7 @@ module Groupdate @@ -62,7 +64,7 @@ module Groupdate
62 "%Y-01-01 00:00:00" 64 "%Y-01-01 00:00:00"
63 end 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 end 68 end
67 when "PostgreSQL", "PostGIS" 69 when "PostgreSQL", "PostGIS"
68 case period 70 case period
test/test_helper.rb
@@ -354,7 +354,7 @@ module TestDatabase @@ -354,7 +354,7 @@ module TestDatabase
354 354
355 def test_default_timezone_local 355 def test_default_timezone_local
356 User.default_timezone = :local 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 ensure 358 ensure
359 User.default_timezone = :utc 359 User.default_timezone = :utc
360 end 360 end