1

I have records in my database like:

id | item_name | 2013-06-05T17:55:13+03:00 

I want to group them by 'items per Day', 'items per Hour', 'items per 20 minutes'.

What is the best way to implement it?

4

2 回答 2

3

简单的方法:

by_day = array.group_by{|a| a.datetime.to_date}
by_hour = array.group_by{|a| [a.datetime.to_date, a.datetime.hour]}
by_20_minutes = array.group_by{|a| [a.datetime.to_date, a.datetime.hour, a.datetime.minute/20]}
于 2013-06-05T16:13:24.537 回答
1
require 'time'

def group_by_period(items)
  groups = { :day => {}, :hour => {}, :t20min => {} }
  items.reduce(groups) do |memo, item|
    # Compute the correct buckets for the item's timestamp.
    timestamp = Time.parse(item[2]).utc
    item_day = timestamp.to_date.to_s
    item_hour = timestamp.iso8601[0..12]
    item_20min = timestamp.iso8601[0..15]
    item_20min[14..18] = (item_20min[14..15].to_i / 20) * 20
    # Place the item in each bucket.
    [[:day,item_day], [:hour,item_hour], [:t20min,item_20min]].each do |k,v|
      memo[k][v] = [] unless memo[k][v]
      memo[k][v] << item
    end
    memo
  end
end

sample_db_output = [
  [1, 'foo', '2010-01-01T12:34:56Z'],
  [2, 'bar', '2010-01-02T12:34:56Z'],
  [3, 'gah', '2010-01-02T13:34:56Z'],
  [4, 'zip', '2010-01-02T13:54:56Z']
]

group_by_period(sample_db_output)
# {:day=>
#   {"2010-01-01"=>[[1, "foo", "2010-01-01T12:34:56Z"]],
#    "2010-01-02"=>
#     [[2, "bar", "2010-01-02T12:34:56Z"],
#      [3, "gah", "2010-01-02T13:34:56Z"],
#      [4, "zip", "2010-01-02T13:54:56Z"]]},
#  :hour=>
#   {"2010-01-01T12"=>[[1, "foo", "2010-01-01T12:34:56Z"]],
#    "2010-01-02T12"=>[[2, "bar", "2010-01-02T12:34:56Z"]],
#    "2010-01-02T13"=>
#     [[3, "gah", "2010-01-02T13:34:56Z"], [4, "zip", "2010-01-02T13:54:56Z"]]},
#  :t20min=>
#   {"2010-01-01T12:20:00"=>[[1, "foo", "2010-01-01T12:34:56Z"]],
#    "2010-01-02T12:20:00"=>[[2, "bar", "2010-01-02T12:34:56Z"]],
#    "2010-01-02T13:20:00"=>[[3, "gah", "2010-01-02T13:34:56Z"]],
#    "2010-01-02T13:40:00"=>[[4, "zip", "2010-01-02T13:54:56Z"]]}}
于 2013-06-05T15:42:26.393 回答