0

行ごとにstart_dateandを持つテーブルがあります。開始日とは異なる年でもかまいません。end_dateend_date

入力月の範囲と重なるすべてのレコードを選択する必要があります。

例えば:

n  start_date  end_date  
1  2010-12-03  2010-03-29  // months are 12,1,2,3  
2  2012-03-11  2010-06-24  // months are 3,4,5,6  
3  2010-06-17  2010-10-04  // months are 6,7,8,9,10  
4  2010-07-03  2010-09-21  // months are 7,8,9  
5  2010-04-21  2011-05-13  // months are 1..12 

入力範囲は 3、4、5、6 です。出力行は次のようになります: 1,2,3,5。行 4 のみ、どの月にも重複がありません。

SQLite/MySQL でこれを実行するにはどうすればよいですか?

Ruby on Rails を使用しています。

4

3 に答える 3

1

「Input Range」は接続された範囲のように聞こえます。したがって、12 か月の範囲がなければ、典型的な解決策はwhere month(start_date) <= $end_month and month(end_date) >= $start_month.

しかし、そのようにモジュロで範囲全体が必要です。関係を月 1 ~ 24 に展開します。

つまり、範囲は次のとおりです。

month(start_date) ... month(end_date) + 12*(year(end_date) - year(start_date))

次に、指定された範囲$from, $toを展開する必要があります。

if($to < $from){ 
    $to += 12;
}

そして、関係は次のように展開されます

month(start_date) <= $to 
and (month(end_date) + 12*(year(end_date) - year(start_date))) >= $from

それが役立つことを願っています。

于 2013-05-25T19:06:35.100 に答える
0

SomeClass.where("start_date >= ? end_date <= ?", start_date.beginning_of_month, end_date.end_of_month)

于 2013-05-25T20:49:24.157 に答える