好的,我有多个项目的开始日期时间和结束日期时间。我需要找出是否有超过3个项目在相同的日期时间内彼此。我只是无法绕过这一个,我可以使用此函数将每个项目的日期变为数组
function getDatesBetween2Dates($startTime, $endTime) {
$day = 86400;
$format = 'm/d/y g:i A';
$startTime = strtotime($startTime);
$endTime = strtotime($endTime);
$numDays = round(($endTime - $startTime) / $day) + 1;
$days = array();
for ($i = 0; $i < $numDays; $i++) {
$days[] = date($format, ($startTime + ($i * $day)));
}
return $days;
}
问题是,它只是第一次出现,而且每天都会增加一整天。它没有考虑到最后几天的时间。我想不出有效的方法。
为了澄清,让我举个例子。我的表中有5个项目,每个项目都有一个日期时间范围..开始和结束。我需要检查这些项目中有4个或更多项目的日期范围是否相同。谁能指出我正确的方向?感谢。
答案 0 :(得分:1)
或许这样的事情?
创建项目中从最早开始日期到最后结束日期的日期列表
迭代将每个商品ID添加到其范围内的每个日期的商品
`
class Item {
private static $next_id = 0;
public $id;
public $start, $end;
public function __construct($start, $end) {
$this->id = self::$next_id++;
$this->start = $start;
$this->end = $end;
}
}
$items = array(
new Item('06-Dec-2011', '12-Dec-2011'),
new Item('01-Dec-2011', '04-Dec-2011'),
new Item('02-Dec-2011', '07-Dec-2011'),
new Item('07-Dec-2011', '09-Dec-2011'),
new Item('06-Dec-2011', '10-Dec-2011'),
);
foreach ($items as $item) {
$start = strtotime($item->start);
$end = strtotime($item->end);
for ($day = $start; $day <= $end; $day += 24 * 60 * 60) {
$dates[$day][] = $item->id;
}
}
foreach ($dates as $day => $ids) {
$count = sizeof($ids);
if ($count > 3) {
echo $count, " items found on ", date('d-M-Y', $day), "\n";
foreach ($ids as $id) {
echo " Item ", $id, "\n";
}
}
}
答案 1 :(得分:1)
“在我的桌子上” - 然后为自己节省很多痛苦,并要求DB为你找到它们。它会更简单,更快。
我不知道“在同一个日期时间内”是什么意思。
你的意思是同一个日历日吗?同一天?同样的24小时?同时达到数据分辨率的准确度(通常为秒)?别的什么?您的代码表明您实际上在寻找重叠范围,而不是显式事件。
类似于:
SELECT a.id, b.id, c.id
FROM atable a,
atable b,
atable c
WHERE a.start_time<=b.start_time
AND b.start_time<=c.start_time
AND a.id<>b.id
AND b.id<>c.id
AND a.id<>c.id
AND a.start_time<=b.end_time
AND a.end_time>=b.start_time
AND b.start_time>=c.end_time
AND b.end_time>=c.start_time;
您只需要处理4个或更多项重叠的笛卡尔积。
答案 2 :(得分:1)
将for ($i = 0; $i < $numDays; $i++) {
更改为for ($i = 0; $i <= $numDays; $i++) {
以获取该范围内的所有日期,包括最后日期。
不幸的是,你会以错误的方式解决这个问题。这是我将如何做的一些伪代码:
Iterate through the list of date ranges
Log the earliest start date
Log the last end date
Iterate through all dates between the earliest start date and the last end date
Iterate through the list of date ranges, to determine how many date ranges contain the current date
If more than three date ranges contain the current date, then store it in an array of conflicting dates
我不相信这是最有效的方式,但除非你处理大日期范围或相当多的日期,否则它会相对较快。