Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I came up with the following solution. It's a mixin for date ranges that adds an iterator for both years and months. It yields sub-ranges of the complete range.</p> <pre><code> require 'date' module EnumDateRange def each_year years = [] if block_given? grouped_dates = self.group_by {|date| date.year} grouped_dates.each_value do |dates| years &lt;&lt; (yield (dates[0]..dates[-1])) end else return self.enum_for(:each_year) end years end def each_month months = [] if block_given? self.each_year do |range| grouped_dates = range.group_by {|date| date.month} grouped_dates.each_value do |dates| months &lt;&lt; (yield (dates[0]..dates[-1])) end end else return self.enum_for(:each_month) end months end end first = Date.parse('2009-01-01') last = Date.parse('2011-01-01') complete_range = first...last complete_range.extend EnumDateRange complete_range.each_year {|year_range| puts "Year: #{year_range}"} complete_range.each_month {|month_range| puts "Month: #{month_range}"} </code></pre> <p>Will give you:</p> <pre><code>Year: 2009-01-01..2009-12-31 Year: 2010-01-01..2010-12-31 Month: 2009-01-01..2009-01-31 Month: 2009-02-01..2009-02-28 Month: 2009-03-01..2009-03-31 Month: 2009-04-01..2009-04-30 Month: 2009-05-01..2009-05-31 Month: 2009-06-01..2009-06-30 Month: 2009-07-01..2009-07-31 Month: 2009-08-01..2009-08-31 Month: 2009-09-01..2009-09-30 Month: 2009-10-01..2009-10-31 Month: 2009-11-01..2009-11-30 Month: 2009-12-01..2009-12-31 Month: 2010-01-01..2010-01-31 Month: 2010-02-01..2010-02-28 Month: 2010-03-01..2010-03-31 Month: 2010-04-01..2010-04-30 Month: 2010-05-01..2010-05-31 Month: 2010-06-01..2010-06-30 Month: 2010-07-01..2010-07-31 Month: 2010-08-01..2010-08-31 Month: 2010-09-01..2010-09-30 Month: 2010-10-01..2010-10-31 Month: 2010-11-01..2010-11-30 Month: 2010-12-01..2010-12-31 </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload