MySQL, Rails ActiveRecord группировка дат и часовых поясов



Я хочу считать пользователей по дате создания.
Когда я запрашиваю своего последнего пользователя, у меня есть:



 > User.last.created_at
=> Thu, 07 Aug 2014 21:37:55 BRT -03:00


Когда я считаю пользователей на дату, я получаю следующее:



> User.group("date(created_at)").count
=> {Fri, 08 Aug 2014=>1}


Дата создания - 7 августа, а результат-8 августа. Это происходит потому, что состояние группы находится в UTC, а мой часовой пояс - "Бразилиа".
У меня есть это в моем application.rb:

config.time_zone = 'Brasilia'
config.active_record.default_timezone = :local


Как это решить?

774   3  

3 ответов:

Сначала попробуйте convert_tz:

User.group("date(convert_tz(created_at,'UTC','[your_time_zone]'))").count

Если convert_tz возвращает null, возможно, вам нужно будет загрузить таблицы часовых поясов с помощью этой командной строки:

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql

Ссылка на mysql convert_tz.

Правка 1:

Если вы используете Rackspace MySQL, вам нужно будет включить корневой доступ к базе данных и запустить запросы часового пояса от имени root. Здесь вы можете найти Инструкции по установке trove и включению корневого доступа с помощью Rackspace API.

Без функции часового пояса просто добавьте часы.

User.group("date(created_at + INTERVAL 8 HOUR)").count

Добавить 8 часов-это часовой пояс Шанхая. Добро пожаловать в Шанхай.

Ваша база данных всегда сохраняется в формате UTC (если вы не измените его), даже если ваше приложение настроено на использование местного времени Бразилии. Когда вы используете оператор where, Rails дает вам возможность указать часовой пояс, в котором вы находитесь. Но в групповом утверждении такого понятия нет. Одним из решений является использование специфической функции базы данных (например, @JaugarChang answer ). Другой делает это:

group = User.group("date(created_at)").count
results = group.map{|date, count| {Time.zone.utc_to_local(DateTime.parse(date)).to_date => count } }
  • Pro: вы не зависите от конкретных собственных функций базы данных, чтобы преобразование часового пояса;
  • Кон: не так быстро по сравнению с первым. Для понимания программисту требуется больше знаний о часовых поясах что здесь происходит?

Comments

    Ничего не найдено.