Commit a92cb587cfd58bcefea7c12f8556d340eba44636

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

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

.gitignore
1 1 *.gem
  2 +.idea
2 3 *.rbc
3 4 .bundle
4 5 .config
... ...
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
... ...