2012-03-29 88 views
0

我在php中創建了一個報告,其中顯示了6個html下拉菜單,並提示用戶輸入他們想要查看報告數據的兩個日期。因此,例如報告繼續如下:之間有關日期在PHP中的邏輯

看到資料:[月] [日] [年]和[月] [日] [年](其中括號表示一個選擇標籤)

而且在這個報告中是一個函數,它可以計算前一天增加或減少的百分比。因此,舉例來說,如果用戶不選擇任何日期範圍,它只是當天的數據,而且這個比例計算公式爲:

round(((($newDataPointCount - $yesterdayDataPointCount)/$yesterdayDataPointCount) * 100),2) 

這顯然是很容易計算只有一天,因爲我可以告訴它用INTERVAL 1 DAY查詢SQL數據庫。但這是我的問題,如果月份發生變化,我將如何計算日間間隔的數量?

如果用戶在一個月內停留,所以它會像[3月] [20] [2012] - [3月] [29] [2012]一樣工作,我可以很容易地計算出該值爲9 ,但是當[2月] [27] [2012] - [3月] [20] [2012]這樣的情況下,我如何計算中間的天數?

只是爲了澄清任何可能出現的問題,我使用PHP和MySQL,並希望保持在這些範圍內。

回答

1

MySQL的DATEDIFF函數應該完成的任務

DATEDIFF

+0

我剛剛簽出了php date-> diff函數。謝謝你的提示! – bswinnerton 2012-03-29 21:01:06

1

日期是不是標量,不應該被如此對待。我的建議是使用適當的日期算術工具。

很多人認爲UNIX時間戳面向日期的功能:

$a = '2012-02-12 14:03:50'; 
$b = '2012-05-30 00:55:03'; 
$days = (strtotime($b) - strtotime($a))/86400; 

然而,日光節約時間和各種因素,可以使這種類型的數學錯誤的。

我的做法是通常使用的DateTime:

$a = new DateTime('2012-02-12 14:03:50'); 
$b = new DateTime('2012-05-30 00:55:03'); 
$diff = $b->diff($a); 
//$diff is now a DateInterval 

然而,要回答你的真正的問題,我不會拉從MySQL基於MySQL的日期數學中的數據,而是我只想給它的日期。

WHERE d >= '2012-02-27' AND d <= '2012-03-29'; 

雖然根據您的要求,您可能需要更改27到26,以抓住前一天並使用它進行計算。

至於做點值的變化,我要麼預先計算並存儲它們,要麼我只是用PHP計算它們。有沒有簡單的方法告訴SQL「嘿抓住這些日期之間的每一條記錄,並且當你在它的時候,對每條記錄的先前記錄做一些數學計算。」

我希望這已經很清楚了,但是我有一種感覺,它與邊界清晰度不同,所以如果是這樣,請讓我知道,我會編輯我的答案。