Rails / Postgresql: Как быстро сгруппировать записи, используя поле даты и времени по дате в определенном часовом поясе? - PullRequest
5 голосов
/ 02 декабря 2011

Я использую postgresql с Ruby on Rails.Прямо сейчас я использую это для подсчета количества пользователей, которые регистрируются за каждый день:

@users_signup_by_day = User.count(:order => 'DATE(created_at) DESC', :group => ["DATE(created_at)"])

Это работает, но пользователи сгруппированы согласно UTC.Как я могу сгруппировать пользователей по EST?

Обновление

пользователи сгруппированы по UTC.Как я могу сгруппировать пользователей в соответствии с EST?

Чтобы уточнить: определенная дата, которая начинается и заканчивается в UTC, отличается от той же даты, которая начинается и заканчивается в EST.Прямо сейчас запрос, сгенерированный вышеуказанной командой, учитывает дату и время, когда пользователь был создан в UTC, и группирует пользователей по дням, когда они были созданы, в соответствии с этим промежутком времени.Как я могу компенсировать это, учитывая, что я хотел бы сгруппировать по датам в соответствии с EST, а не UTC?

Я пробовал следующее (спасибо Эрвину Брандштеттеру):

User.count(:order => "DATE(created_at AT TIME ZONE 'EST') DESC", :group => ["DATE(created_at AT TIME ZONE 'EST')"])

Но это нене дает правильный результат, потому что первый результат -

["2011-12-02", 276]

, а в EST это не 12/02/2011 (UTC - 5 часов).Буду признателен за любую помощь.

Ответы [ 2 ]

6 голосов
/ 02 декабря 2011

Вы можете использовать выражение timestamp_column AT TIME ZONE 'EST' перед тем, как выполнить приведение к дате.Рассмотрим эту демонстрацию:

SELECT t AS ts_utc
      ,t::date AS date_utc
      ,t AT TIME ZONE 'EST' AS ts_est
      ,(t AT TIME ZONE 'EST')::date AS date_est
FROM (
    VALUES
     ('2011-12-1 03:00'::timestamp) -- defaults to timestamp without time zone
    ,('2011-12-2 12:00')
    ,('2011-12-3 23:00')) t(t);

Результат:

       ts_utc        |  date_utc  |         ts_est         |  date_est
---------------------+------------+------------------------+------------
 2011-12-01 03:00:00 | 2011-12-01 | 2011-12-01 09:00:00+01 | 2011-12-01
 2011-12-02 12:00:00 | 2011-12-02 | 2011-12-02 18:00:00+01 | 2011-12-02
 2011-12-03 23:00:00 | 2011-12-03 | 2011-12-04 05:00:00+01 | 2011-12-04

ts_est представляет собой буквальное время, заданное в этом часовом поясе, которое автоматически преобразуется в часовой пояс вашего текущего местоположенияв моем случае «+01», так как мой сервер баз данных находится в Вене, Австрия, и имеет соответствующие настройки локали.

Из вашего вопроса не совсем ясно, что означает "согласно EST".Но так или иначе, вы можете достичь этого с помощью этой конструкции.

1 голос
/ 27 октября 2012

Я немного опоздал на вечеринку, но так как я сам столкнулся с этой проблемой, я подумал, что опубликую что-то, что, кажется, работает в моей ситуации. Я изменяю поле даты в базе данных, добавляя / вычитая смещение UTC на основе настроенного часового пояса рельсов. Так, например:

offset = Time.zone.formatted_offset   
interval = "#{offset[0]} time '#{offset[1..-1]}'" 

@users_by_day = User.group("date(created_at #{interval})").select("count(id) as counter, date(created_at #{interval}) as created")

Не очень красиво, но, кажется, справляется с работой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...