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
Как это решить?
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