要獲得特定日期範圍的所有結果,請勿按日期分組;而是使用WHERE子句來限制計數的日期。否則,查詢非常相似。
$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");
這裏只是本身格式化了幾行爲清楚起見,查詢:
SELECT type, count(*)
FROM tracking
WHERE htcode = '$htG'
AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used')
AND date >= '$start_date' AND date <= '$end_date'
GROUP BY type
只要確保你的$start_date
和$end_date
第一設置的值。例如,今天你只是他們兩個設置爲這樣:
$start_date = date('Y-m-d');
$end_date = date('Y-m-d');
注意date('Y-m-d')
是像YYYY-MM-DD
格式只是今天的日期。
昨天,你在昨天的時間戳傳遞到date()功能,但使用相同的格式:
$start_date = date('Y-m-d', strtotime('yesterday'));
$end_date = date('Y-m-d', strtotime('yesterday'));
而且在過去的三十天你會開始在30天前和結束的今天:
$start_date = date('Y-m-d', strtotime('30 days ago'));
$end_date = date('Y-m-d');
你可以這樣做任何開始/結束日期。請注意,我使用的是strtotime(),它允許您使用很多英語短語來指定時間戳,而不必進行日期算術。
而且,因爲你會被多次執行查詢時,它很可能是有意義的邏輯分離出來,到它自己的功能:
function report_range($htG, $start_date, $end_date) {
$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type");
while ($result = mysql_fetch_assoc($query)){
echo $start_date . '-' . $end_date . '/' . $result['type'] . ' = ' . $result['count(*)'];
echo '<br>';
}
}
然後像這樣運行在(最近30天這個例子):
report_range($htG, date('Y-m-d', strtotime('30 days ago')), date('Y-m-d'));
感謝您的答覆本..我想顯示4個不同的結果。今天,昨天,上個月和去年。這就是爲什麼我認爲我會用PHP來排序日期..你會建議什麼? – 2012-02-08 01:51:52
或者您可以使用'WHERE date BETWEEN'$ start_date'AND'$ end_date''以獲得更好的可讀性。 – 2012-02-08 01:52:04
@DanielHunter,我添加了一些例子,展示了今天,昨天和過去30天的情況。一年來,你的意思是365天嗎?如果是這樣,你可以使用與過去30天相同的格式,只需要365. – 2012-02-08 01:56:24