2013-12-04 4 views
0

Я следующий кодRails 4: как использовать UNIX_TIMESTAMP с группой ГОД

Call.group('YEAR(created_at)').count 

Который возвращает

{2013=>81577, 2012=>93323, 2011=>79915, 2010=>59084, 2009=>55561} 

Как я могу использовать UNIX_TIMESTAMP за годы, так что возвращается значение UNIX_TIMESTAMP (например, 1356912000000) вместо года (например, 2013)?

Я попытался

Call.group('UNIX_TIMESTAMP(YEAR(created_at))').count 

Но это не сработало.

спасибо.

ответ

0

unix_timestamp() ожидает аргумент date/datetime и возвращает int. year() возвращает целое число, поэтому вы будете делать недопустимую операцию. Вы должны были бы сделать что-то вроде

UNIX_TIMESTAMP(CONCAT(YEAR(created_at), '-01-01 00:00:00')) 

который будет вычисляться

UNIX_TIMESTAMP('2013-01-01 00:00:00') 

и дать вам метку времени для начала года.

0

, вероятно, лучший способ сделать это - но он должен работать

counts = {} 
# NOTE: could be off by a few records near the end of the year due to timezones 
raw_counts = Call.group('YEAR(created_at)').count 

raw_counts.each do |key, value| 
    # rebuild the hash key 
    # convert date to first day of the year 
    # use to_i on the date to get unix timestamp 
    counts[Time.zone.parse("#{key}-01-01").to_i] = value 
end 

counts.inspect

{ 
    1293840000 => 221794, 
    1325376000 => 239135, 
    1356998400 => 293378 
}