我有一个带预订的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有一种简单的方法吗?
谢谢。
答案 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;]值是您正在寻找的。 p>