2010-12-21 95 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