2010-12-21 89 views
0

我在DB中有一个表格,其中包含天的摘要。有些日子可能没有价值。 我需要显示带有结果的表格,其中每列是用户选择范围内的一天。 我试图玩时间戳(end_date - start_date/86400 - 报告中有多少天,然后使用DATEDIFF(row_date,'user_entered_start_date')并从此索引创建数组),但现在我已经有了一大堆解决方法夏季时间:(任何实例或想法如何使这正确吗?PHP:带日期空白的报告表

PS我需要这样做的PHP的一面,因为DB处于高负荷。

回答

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表,并通过9将数字0:

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; 

如果你离开加盟像上面到你的正常查询序列查询,你应该能够产生真正和空行。例如

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; 
0

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

+0

我想到了这一点,但DB变得巨大而且非常缓慢。 (atm与间隙有〜870000条记录,加上空白导致〜2500000条记录) – Daniel 2010-12-21 14:24:13

+0

啊,你有很多空白来填写。在这种情况下,你需要处理这些数据,听起来像你在做什么。最好的结果可能是将你从数据库中得到的数据处理成一些自动处理空白的结构,就像一个能够返回真实数据的对象,当没有数据时填充“空白”数据。 – 2010-12-21 14:31:54