每月最大重叠日期时间范围

时间:2016-01-19 14:15:54

标签: php mysql

我有一个带预订的mysql表:

 - id
 - isok (boolean)
 - start (datetime)
 - end (datetime)

此表格表示停在开始和结束之间的汽车。 我需要在一个月内同时获得停车的最大数量,两个日期之间的每个月($ limit_start和$ limit_end)(仅适用于isok为true的预订)。

所以最后我需要这样的东西:

(2015年10月1日的$ limit_start和2015年12月31日的$ limit_end)

[10-2015:7,11-2015:12,12-2015:9]

使用php和mysql有一种简单的方法吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

我猜你需要这样的东西,虽然它可能需要一些调整

/**
 * @var \DateTime
 *
 * @ORM\Column(name="act_month", type="datetime")
 */
private $actMonth;

public function __construct()
{
  $date = \DateTime::createFromFormat('M', 'now');
  $this->actMonth = $date;
}

答案 1 :(得分:0)

这可能是一些错误,但首先你要查询这样的结果:

SELECT * FROM (
SELECT id,YEAR(MAX(start,:limit_start)) as ts_year, MONTH(MAX(start,:limit_start)) as ts_month, 1 as status FROM bookings WHERE start BETWEEN :limit_start AND :limit_end OR end BETWEEN :limit_start AND :limit_end
UNION ALL
SELECT id, YEAR(MIN(end,:limit_end)) as ts_year, MONTH(MIN(end,:limit_end)) as ts_month, -1 as status FROM bookings WHERE start BETWEEN :limit_start AND :limit_end OR end BETWEEN :limit_start AND :limit_end )
ORDER BY ts_year,ts_month

之后,使用php循环遍历结果集并存储每月的最大值。

<?php
$stat=[];
foreach($result as $item)
{
 $key=$item['ts_year'].'-'.$item['ts_month'];
 if(!isset($stat[$key]))
 {
  $stat[$key]=['current'=>0,'max'=>0];
 }

 $stat[$key]['current']+=$item['status']; //add 1 if arrived or -1 if left

 if($stat[$key]['max']<$stat[$key]['current'])
     $stat[$key]['max']=$stat[$key]['current'];
}
?>

最后,$ stat [$ key] [&#39; max&#39;]值是您正在寻找的。