日期范围和活动天数为 rails
date range and event days count on rails
对于您来说,将某些事件日期范围存储到数据库中的最佳方式是什么?如果您之后需要检查一个月中每天有多少事件?
示例
1st event from 12/07 to 15/07
2th event from 14/07 to 17/07
3th event just at 15/07
如果我通过一个查询检查数据库,我希望得到这样的结果:
12/07,(1 event)
13/07,(1 event)
14/07,(2 event)
15/07,(3 event)
16/07,(1 event)
17/07,(1 event)
如果我使用 start_day 和 end_day 来存储一些事件,也许我在这方面遇到了一个小问题:
如果我使用那个 2 元素 (start_day & end_day) 我 select 那一天之间有多少事件而不是每天有多少事件,例如,如果你有1 个事件,持续时间为 3 天(从 11 到 14),另一个事件为 2 天(从 12 到 14),如果我检查有多少事件我有 13 我什么都没有,因为日期没有出现但是如果我检查 SELECT * FROM event BETWEEN date_begin AND date_end
就会出现
这在 Ruby 中使用 post 处理要简单一些。假设您有以下 date_begin
和 date_end
:
date_begin = Date.new(2015, 7).beginning_of_month
date_end = Date.new(2015, 7).end_of_month
然后可以用
查询指定范围内的事件
Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)
要获得每天的计数,您可以post-像这样处理结果
Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)
.flat_map{|event| (event.start_day..event.end_day).to_a }
.each_with_object(Hash.new(0)){|day, counts| counts[day] += 1 }
如果你真的想简单地做到这一点 SQL,你可以在指定范围内生成一系列天数,然后将其加入事件 table。
results = ActiveRecord::Base.connection.execute <<-SQL
SELECT day, count(events) FROM (
SELECT day
FROM generate_series('#{date_begin}'::date, '#{date_end}', '1 day')
AS day
) days
INNER JOIN events
ON day BETWEEN start_day AND end_day
GROUP BY day
SQL
如果你想把它变成一个看起来像第一种方法的哈希,你可以这样做
results.map{|r| [r['day'].to_date, r['count'].to_i] }.to_h
两种方法都会产生以下结果:
{
Sun, 12 Jul 2015=>1,
Mon, 13 Jul 2015=>1,
Tue, 14 Jul 2015=>2,
Wed, 15 Jul 2015=>3,
Thu, 16 Jul 2015=>1,
Fri, 17 Jul 2015=>1
}
对于您来说,将某些事件日期范围存储到数据库中的最佳方式是什么?如果您之后需要检查一个月中每天有多少事件? 示例
1st event from 12/07 to 15/07
2th event from 14/07 to 17/07
3th event just at 15/07
如果我通过一个查询检查数据库,我希望得到这样的结果:
12/07,(1 event)
13/07,(1 event)
14/07,(2 event)
15/07,(3 event)
16/07,(1 event)
17/07,(1 event)
如果我使用 start_day 和 end_day 来存储一些事件,也许我在这方面遇到了一个小问题:
如果我使用那个 2 元素 (start_day & end_day) 我 select 那一天之间有多少事件而不是每天有多少事件,例如,如果你有1 个事件,持续时间为 3 天(从 11 到 14),另一个事件为 2 天(从 12 到 14),如果我检查有多少事件我有 13 我什么都没有,因为日期没有出现但是如果我检查 SELECT * FROM event BETWEEN date_begin AND date_end
就会出现这在 Ruby 中使用 post 处理要简单一些。假设您有以下 date_begin
和 date_end
:
date_begin = Date.new(2015, 7).beginning_of_month
date_end = Date.new(2015, 7).end_of_month
然后可以用
查询指定范围内的事件Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)
要获得每天的计数,您可以post-像这样处理结果
Event.where('start_day >= ? AND end_day <= ?', date_begin, date_end)
.flat_map{|event| (event.start_day..event.end_day).to_a }
.each_with_object(Hash.new(0)){|day, counts| counts[day] += 1 }
如果你真的想简单地做到这一点 SQL,你可以在指定范围内生成一系列天数,然后将其加入事件 table。
results = ActiveRecord::Base.connection.execute <<-SQL
SELECT day, count(events) FROM (
SELECT day
FROM generate_series('#{date_begin}'::date, '#{date_end}', '1 day')
AS day
) days
INNER JOIN events
ON day BETWEEN start_day AND end_day
GROUP BY day
SQL
如果你想把它变成一个看起来像第一种方法的哈希,你可以这样做
results.map{|r| [r['day'].to_date, r['count'].to_i] }.to_h
两种方法都会产生以下结果:
{
Sun, 12 Jul 2015=>1,
Mon, 13 Jul 2015=>1,
Tue, 14 Jul 2015=>2,
Wed, 15 Jul 2015=>3,
Thu, 16 Jul 2015=>1,
Fri, 17 Jul 2015=>1
}