PHP:包含日期空白的报告表

时间:2010-12-21 14:16:33

标签: php datetime report

我在DB中有一个表,其中包含几天的摘要。有些日子可能没有价值。 我需要显示包含结果的表格,其中每列是用户选择范围的一天。 我尝试使用timestamp(end_date - start_date / 86400 - 报告中的天数,然后使用DATEDIFF(row_date,'user_entered_start_date')并从这些索引创建数组),但现在我已经获得了大量的解决方法夏令时:(任何例子或想法如何使这个正确?

P.S。我需要在PHP端执行此操作,因为DB负载很高。

2 个答案:

答案 0 :(得分:1)

尝试使用DateTime对象:

$reportdate=date_create($user_startdate);
$interval=new DateInterval('P1D');//1 day interval

$query="SELECT s.start_date, s.end_date, s.info 
   FROM summary s 
   WHERE s.start_date>='$user_startdate' 
      AND s.end_date<='$user_enddate'";

$r=mysqli_query($db,$query);
while($row=$r->fetch_assoc()){
  $rowdate=create_date($row['start_date']);
  while($reportdate < $rowdate) {//won't work if $rowdate is a timestamp!  
    //output $reportdate and blank row
    $reportdate->add($interval); //increment date
  }
  //output $rowdate and $row[info]
  $reportdate->add($interval); //increment date

}

ETA另一种选择:

根据您的评论,动态生成缺失日期可能更容易。为此,您需要一个整数表,应该在报表输出中显示的日期数,开始日期和日期增量。

在您的数据库中创建一个名为numbers的表并插入数字0到9:

CREATE TABLE  numbers (
  num int(10) unsigned NOT NULL,
  PRIMARY KEY (num)
);

数字表可用于制作整数序列。例如,要获得从1到20的序列:

SELECT i FROM (
  SELECT 10*n1.num + n2.num AS i 
  FROM numbers n1 CROSS JOIN numbers n2) nums
WHERE i BETWEEN 1 AND 20
ORDER BY i ASC;

如果您将常规查询中的上述序列查询连接起来,则应该能够生成实际行和空行。 e.g。

SELECT alldates.d, mystuff.* FROM
    (SELECT date_add($start_date, interval i day) AS d FROM 
        (SELECT 10*n1.num + n2.num AS i
         FROM numbers n1 CROSS JOIN numbers n2
         ORDER BY i ASC) nums
     WHERE i <= DATEDIFF($end_date,$start_date)) alldates
LEFT JOIN mystuff
ON alldates.d = mystuff.somedate
ORDER BY $whatever;

答案 1 :(得分:0)

您可以使用空值“预加载”数据库。然后执行UPDATE查询而不是插入。所有没有数据的日子都会预先填充。您可以创建一个简单的脚本,创建一个月/年/十年的(空白)数据,并根据需要随时运行。然后你永远不必担心没有数据的日子如何进入数据库 - 你开始将数据“归零”。