3

データベースから選択して、日付が月に該当する「キャンペーン」を取得しようとしています。これまでのところ、今月中に開始または終了する行を取得することに成功しています。ここで行う必要があるのは、1か月で始まり、数か月後に終了する行を選択することです(例 1年の3か月目で、1か月目から5か月目まで実行される「キャンペーン」があります。その他例2012年から2013年まで実行される「キャンペーン」があります

私は、MySqlを介して、capaignが実行される可能性のあるすべての行を選択する方法があることを望んでいます。そうでない場合は、データベース内のすべてのデータを取得し、現在の月に実行されたデータのみを表示する必要があります。

「dateRange」と呼ばれる、配列内の各日付の間のすべての日を表示する関数をすでに作成しました。また、「runTime」と呼ばれる、キャンペーンが実行される日数を示す別のものを作成しました。

すべて選択 (明らかに)

$result = mysql_query("SELECT * FROM campaign");

今月開始を選択

$result = mysql_query("SELECT * FROM campaign WHERE YEAR( START ) = YEAR( CURDATE( ) ) AND MONTH( START ) = MONTH( CURDATE( ) )");

今月末を選択

$result = mysql_query("SELECT * FROM campaign WHERE YEAR( END ) = YEAR( CURDATE( ) ) AND MONTH( END ) = MONTH( CURDATE( ) ) LIMIT 0 , 30");

コードサンプル

while($row = mysql_fetch_array($result))
{
$dateArray = dateRange($row['start'], $row['end']);

echo "<h3>" . $row['campname'] . "</h3> Start " . $row['start'] . "<br /> End " . $row['end'];
echo runTime($row['start'], $row['end']);
print_r($dateArray);
}

日付に関しては、MySqlデータベースはキャンペーンの開始日と終了日のみを保持します。

4

1 に答える 1

4

日付/時刻の重複を検出するには、次のようにします。

//range of dates to get overlap. means if any row in the database has
//a day in its start/end range that falls between these days
$startDate = '2012-06-01';
$endDate = '2012-06-30';

$sql = "SELECT *
    FROM campaign
    WHERE
        `start` < '$endDate'
        AND `end` > '$startDate'";

これにより、$startDateと$endDateの間にある日を持つキャンペーンの行が検索されます。これは、キャンペーンのすべての発生に対しても機能します...:

  1. $ startDateの前に開始し、$ endDateの前に終了します(日付範囲間の終了日)
  2. $ startDateの後に開始し、$ endDateの前に終了します(日付範囲間の開始と終了の両方)
  3. $ startDateの前に開始し、$ endDateの後に終了します(開始と終了には日付範囲が含まれます)
  4. $ startDateの後に開始し、$ endDateの後に終了します(日付範囲間の開始日)

また、このクエリは現状では$startDateと$endDateを排他的に持っています。つまり、何かが5月31日に始まり(上記の日付の例に基づく)、6月1日に終わる場合、それは含まれません。日付を包括的にしたい場合は、><を変更して、開始日>=<=終了日を含めることができます。

于 2012-06-08T22:21:01.043 に答える