2013-04-09 17 views
0

我有一臺名爲預訂與這些字段:(說$從通過時隙分組的MySQL顯示統計

`id` int(11) NOT NULL AUTO_INCREMENT, 
`username` varchar(150) NOT NULL, 
`begin_time` datetime NOT NULL, 
`end_time` datetime NOT NULL, 
`node_id` int(11) NOT NULL, 
PRIMARY KEY (`id`) 

我希望在一個給定的時間內,以顯示有關預訂的統計數據 - $直到值來自何處PHP)。用戶預訂一個節點。有很多節點可以預訂,我使用以下查詢按日期顯示預訂統計信息。

SELECT DATE(begin_time) `Date`, count(id) as reservations 
FROM reservation 
WHERE begin_time > '" . $from . "' 
AND end_time < '" . $until . "' 
GROUP BY Date" 

現在我想給出一天中哪個時間段更加活躍的統計數據。一天中的24小時分爲48個三十分鐘的時段。在我的表中,所有的begin_date和end_date值都是像2011-04-11 20:00:00或2011-04-11 14:30:00那樣的整數。預訂時間可以爲30分鐘,60分鐘等,最長可達4小時。

我想我的統計是按以下格式(或多或少)

Time slot  | reservations 
---------------------------------- 
00:00:00 - 00:30:00 |  23 
00:30:00 - 01:00:00 |  12 
01:00:00 - 01:30:00 |  20 
01:30:00 - 02:00:00 |  66 
02:00:00 - 02:30:00 |  12 
       and so on 

你能幫助我的SQL查詢?我現在看到PostgreSQL有一些範圍類型和運算符,例如< @(範圍包含)documentation here。這是否意味着如果我使用Postgres,我的查詢會更容易? MySQL有類似的東西嗎?

編輯2:謝謝,tombom。實際上,我改變了你的答案,從select子句和group by子句中刪除了DATE(begin_time)AS Date,因爲我想查看一天中哪幾小時是最活躍的,在多天的時間段內。我可以生活在1小時的粒度而不是30分鐘。 但我想問你,你的第一句話到底是什麼意思。如果預訂在01:00:00開始,並在03:00:00結束,我確實希望它在兩個時間段都被計算在內。

回答

1

在我的表,所有的BEGIN_DATE日期和結束日期值是圓的號碼,如2011-04-11 20:00:00 2011-04-11或14:30:00

除非你也有像2011-04-11 14:15:00時間你想要的結果與30分鐘的步驟沒有多大意義,除非你想要計數一些保留兩次。

除此之外,在MySQL中它會是這樣的:

SELECT 
DATE(begin_time) AS `Date`, 
CASE 
WHEN TIME(begin_time) >= '00:00:00' AND TIME(begin_time) < '01:00:00' THEN '00:00:00 - 01:00:00' 
WHEN TIME(begin_time) >= '01:00:00' AND TIME(begin_time) < '02:00:00' THEN '01:00:00 - 02:00:00' 
/*...and so on...*/ 
END AS `TimeSlot`, 
COUNT(id) as reservations 
FROM reservation 
WHERE begin_time > '" . $from . "' 
AND end_time < '" . $until . "' 
GROUP BY `Date`, `TimeSlot` 

我做了1個小時就時隙和加入到分組上的日期。

其實,我傻,現在我想想,當你有整整一個小時的時段,你也可以做這樣的:

SELECT 
DATE(begin_time) AS `Date`, 
HOUR(begin_time) AS `TimeSlot`, 
COUNT(id) as reservations 
FROM reservation 
WHERE begin_time > '" . $from . "' 
AND end_time < '" . $until . "' 
GROUP BY `Date`, `TimeSlot` 

UPDATE:

SELECT 
CASE 
WHEN TIME(begin_time) BETWEEN '00:00:00' AND '01:00:00' OR TIME(end_time) BETWEEN '00:00:00' AND '01:00:00' THEN '00:00:00 - 01:00:00' 
WHEN TIME(begin_time) BETWEEN '01:00:00' AND '02:00:00' OR TIME(end_time) BETWEEN '01:00:00' AND '02:00:00' THEN '01:00:00 - 02:00:00' 
/*...and so on...*/ 
END AS `TimeSlot`, 
COUNT(id) as reservations 
FROM reservation 
WHERE begin_time > '" . $from . "' 
AND end_time < '" . $until . "' 
GROUP BY `TimeSlot` 
+0

謝謝,我編輯了我的答案,並請澄清,如果可以的話。 – engineerX 2013-04-09 12:44:16

+0

@engineerX更新了我的答案。 – fancyPants 2013-04-09 13:17:58