Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 返回在一个时间段内每天创建、关闭和打开的记录数_Php_Mysql - Fatal编程技术网

Php 返回在一个时间段内每天创建、关闭和打开的记录数

Php 返回在一个时间段内每天创建、关闭和打开的记录数,php,mysql,Php,Mysql,我有一个存储创建和关闭日期的表。我要做的是运行一个查询,在给定的时间段内,每天生成多少条记录,关闭多少条记录,打开多少条记录。表结构: +------------------------+ | Field | Structure | +------------+-----------+ | id | int | | start_date | datetime | | close_date | datetime | +------------+------

我有一个存储创建和关闭日期的表。我要做的是运行一个查询,在给定的时间段内,每天生成多少条记录,关闭多少条记录,打开多少条记录。表结构:

+------------------------+
| Field      | Structure |
+------------+-----------+
| id         | int       |
| start_date | datetime  |
| close_date | datetime  |
+------------+-----------+
前两个查询不是问题-我现在处理的是:

选择COUNT(*),开始日期从日期开始
“开始”和“结束”之间的开始日期
按开始日期分组
按开始日期ASC订购
选择计数(*),从日期结束日期
“开始”和“结束”之间的截止日期
按关闭日期分组
按截止日期订购ASC
第三个查询是一个问题——我可以让它给出表中某一天有多少个打开的,但我没有弄清楚的是如何让它为一年中的每一天写一行,并给我该天的计数

这是第一个问题

第二,我想让它给我一个这样的结果,但我不知道怎么做-在这里搜索给了我一些错误的开始,但没有可靠的结果

+------------+--------+--------+--------+
|    Date    | Opened | Closed | Active |
+------------+--------+--------+--------+
| 2012-05-06 | 3      | 2      | 7      |
| 2012-05-07 | 2      | 0      | 9      |
| 2012-05-08 | 0      | 0      | 9      |
| 2012-05-09 | 0      | 3      | 6      |
+------------+--------+--------+--------+
如果必要的话,我完全愿意运行单独的查询,并在代码中处理所有查询,如果必须的话,我可以用db来处理所有查询——我相当肯定我可以将单个查询中的所有查询数据写入一个数组,然后通过循环来构建报告,但我真的不希望这样。有什么建议吗

我可以让它告诉我一天中有多少是开放的,而这一天存在于表中,但我没有弄清楚的是如何让它为一年中的每一天写一行,并给我当天的计数

我的理解是:你想计算每个截止日期的问题吗?


仅使用SQL语句就很难创建这样的聚合表。您需要使用子查询、UNION语句和/或可能的存储过程来获取逻辑点,以便在显示表时显示它

您已经使用的两个查询比我上面提到的方法快得多。PHP数组肯定会帮助您获得所需的内容

因此:

步骤1

在开始之前选择COUNT(*)作为活动\u
其中开始日期<‘开始’
并且关闭日期为空
在开始之前获取该号码并将其存储在$active\u中

步骤2

选择COUNT(*)作为总打开日期,开始日期从日期开始
“开始”和“结束”之间的开始日期
按开始日期分组
按开始日期ASC订购
将这些结果放入数组中

foreach($results as$result)
{
$key=$result->start\u date;
$final_表[$key]['date']=$key;
$final_table[$key]['opened']=$result->total_opened;
}
步骤3

再次将这些存储在数组中

foreach($results as$result)
{
$key=$result->close\u date;
$final_表[$key]['date']=$key;
$final_table[$key]['closed']=$result->total_closed;
}
步骤4

现在,您可以遍历该表以操作数据,从而生成所需的结果:

$results_table=array();
$active=$active\u启动前;
foreach($key=>$item形式的最终表格)
{
$opened=(isset($item['opened'])?$item['opened']:0;
$closed=(isset($item['closed'])?$item['closed']:0;
$active=$active+($opened'-$closed);
$results_table[$key]['date']=$key;
$results_table[$key]['opened']=$opened;
$results_table[$key]['closed']=$closed;
$results_table[$key]['active']=$active;
}
从那时起,您可以始终执行“以防万一”来显示排序后的数组结果


HTH

此查询很棘手,因为您需要范围内每个日期的状态列表

在此查询中,日期是在联接查询中生成的。 为此,我使用了相同的表,假设它

  • 记录计数>=日期范围之间的日期数
  • id-s必须在daterange和daterange之间连续到多个日期
您可以将其替换为自己的日期列表生成子查询

set@start:=“2012-05-06”;
结束时设置:='2012-05-09';
选择cdate作为日期
,sum(开始日期=cdate)已打开
,sum(结束日期=cdate或结束日期为空)结束
,sum(开始日期cdate或结束日期为空))处于活动状态
从日期开始

加入(选择日期(@start+interval id-1天)cdate from dates where id where you store该问题是否已关闭/活动?打开的是创建记录的时间,我想。其他的呢?-没关系,我只是注意到了关闭日期。不完全-我实际上已经在这样做了。我试图做的是生成历史数据-而不是在e上关闭了多少每个截止日期,或者每个截止日期有多少个,但一年中每天有多少个是开放的。好吧,我了解多一点。如果没有人给你答案,我明天会回来回答。这对一些人有帮助-至少让我获得了我需要的大部分产出。非常感谢:)我想我实际上要做的是在数据库中创建一个新表,根据每天打开/关闭的项目来存储活动计数,然后查询它。这比获得真正的活动历史计数要简单得多。创建一个可用于报告目的的新表(如您的表)绝对是一个gre在idea。你还可以做的一件事是创建一个脚本,在给定的日期范围内重新计算新表的数据。这样,你的数据将始终是准确的。我发现有人有一份旧报告,让我填写大部分历史计数。在以后的日子里,我创建了一个存储日期和计数的表-当记录创建d时,它检查存储的最后一个日期是否等于当前日期。如果等于,则增加现有计数。如果日期不等于,则获取
SELECT COUNT(*) FROM dates WHERE your_condition GROUP BY DAY_OF_YEAR(close_date)
SELECT COUNT(*) AS total_closed, close_date FROM dates 
WHERE close_date BETWEEN 'start' AND 'end' 
GROUP BY close_date 
ORDER BY close_date ASC