2011-09-12 13 views
0

イベントがあります。がMySQLデータベースにあり、それらを抽出してカレンダーをフィードする必要があります。通常のイベントは問題ではありませんが、私は毎年繰り返すことができる特別なイベントがあります。私の問題は、これらのイベントを抽出する方法です。私は[$ ini_month、$ ini_day]区間内のイベントを取得するには、これを試してみました - [$ end_month、$ END_DAY]:MySQL:指定された2つの日付の間でアイテムを取得

SELECT * FROM `events` 
WHERE `repeat`='1' AND 
    MONTH(`date`) BETWEEN '$ini_month' AND '$end_month' AND 
    DAY(`date`) BETWEEN '$ini_day' AND '$end_day' 

たとえば、私は7月7日に7月1日からイベントを取得する必要がある場合、$ ini_month = $ end_month = 7、$ ini_day = 1、$ end_day = 7です。この場合、このクエリは機能しますが、6月25日から7月7日までイベントを取得する必要がある場合、$ end_day < $ ini_dayに失敗します。ですから、入力に照らして動作するようにこのクエリを一般化する手助けをしてください。

答えて

0

"boder months"は特別に扱わなければなりません。

SELECT * FROM `events` 
WHERE `repeat`='1' AND 
    MONTH(`date`) BETWEEN '$ini_month+1' AND '$end_month-1' OR 
    (MONTH(`date`) == $ini_month AND DAY(`date`) > '$ini_day') OR 
    (MONTH(`date`) == $end_month AND DAY(`date`) < '$end_day') 

が有効です。しかし、これは非常に醜いです。

あなたが適切な値に$ini_month_day$end_month_dayを設定した場合は代わりに、あなたは

WHERE `repeat`='1' AND 
    MONTH(`date`) * 100 + DAY(`date`) BETWEEN $ini_month_day AND $end_month_day 

ような何かを行うことができます。

この方法でインデックスを使用することはできないため、最適ではないことに注意してください。

0

日付の日数を比較すると、すべて非常にsimpilerになるだろう:

SELECT * FROM `events` 
WHERE `repeat`='1' AND 
`date` BETWEEN '$start_date' AND '$end_date' 

ORおそらく(あなたも終了年があれば......)

SELECT * FROM `events` 
WHERE `repeat`='1' AND 
`date` BETWEEN STR_TO_DATE(CONCAT($ini_day,'-','$ini_month','-','$ini_year'),'%d-%m-%Y') 
AND STR_TO_DATE(CONCAT($end_day,'-','$end_month','-','$end_year'),'%d-%m-%Y') 
関連する問題