Захват строк из MySQL, где текущая дата находится между датой начала и датой окончания (проверьте, находится ли текущая дата между датой начала и датой окончания)


Я пытаюсь выбрать из базы данных, чтобы получить "кампании", даты которых попадают в месяц. До сих пор мне удавалось собирать строки, которые начинаются или заканчиваются в текущем месяце. Что мне нужно сделать сейчас, так это выбрать строки, которые начинаются через один месяц и заканчиваются через несколько месяцев (, НАПРИМЕР: Это 3-й месяц в году, и есть "кампания", которая проходит с 1-го по 5-й месяц. другой пример Существует "кампания", которая проводится с 2012 по 2013 )

Я надеюсь, что есть какой-то способ выбрать через MySQL все строки, в которых может выполняться capaign. Если нет, я должен захватить все данные в базе данных и показать только те, которые работают в текущем месяце.

Я уже создал функцию, которая отображает все дни между каждой датой внутри массива, который называется "Диапазон дат". Я также создал еще один, который показывает, сколько дней длится кампания под названием "Время выполнения".

Выберите все (Очевидно)

$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 содержит только дату начала и дату окончания кампании.

Author: saluce, 2012-06-09

1 answers

Чтобы обнаружить совпадение даты/времени, вы можете сделать что-то вроде этого:

//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'";

, Который найдет любую строку из кампании, у которой есть любой день, который находится между датой начала и датой окончания. Это также работает для всех случаев кампании...:

  1. начинается до даты начала $ и заканчивается до даты окончания $ (дата окончания между диапазонами дат)
  2. начинается после даты начала $ и заканчивается до даты окончания $ (как начало, так и конец между диапазоном дат)
  3. начинается до даты начала $ и заканчивается после даты окончания $ (диапазон дат начала и окончания)
  4. начинается после даты начала и заканчивается после даты окончания (дата начала между диапазонами дат)

Кроме того, этот запрос в его нынешнем виде имеет $StartDate и $EndDate как эксклюзивные. Это означает, что если что-то начнется 31 мая (на основе приведенных выше дат примера) и закончится 1 июня, это не будет включено. Если вы хотите, чтобы даты были включительными, вы можете изменить > и < на >= и <=, чтобы включить дату начала и окончания.

 4
Author: Jonathan Kuhn, 2012-06-08 22:38:42