3

我正在尝试从数据库中进行选择以获取日期为当月的“活动”。到目前为止,我已经成功地抓取了在当月内开始或结束的行。我现在需要做的是选择从一个月开始到几个月结束的行(例如: 这是一年中的第三个月,并且有一个从第一个月到第五个月的“活动”。其他示例有一个从 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 日结束,则不会包括在内。如果您希望日期包含在内,您可以将 and 更改为>and<>=包含<=开始和结束日期。

于 2012-06-08T22:21:01.043 回答