今天拿到一個查詢需求,須要統計某一天各個時間段內的記錄數量。sql
具體是統計某天9:00至22:00時間段,每半小時內訂單的數量,最後造成的數據形式以下:
時間段 訂單數
9:00~9:30 xx個
9:30~10:00 xx個
...
若是說是按每一個小時來統計訂單數量,這個是比較簡單的,只要將訂單表中的OrderTime字段中的小時取出,而後根據每一個小時的值進行group by就能夠了。
select T.timehour,count(T.orderid) as number from
(
select o.orderid,datename(hh,o.ordertime) as timehour from orders as o
where o.ordertime<'2013-10-20 22:00' and o.ordertime>'2013-10-20 9:00'
) as T
group by T.timehour
order by timehour asc
可是若是要實現上面的那種查詢就有點麻煩了。我想到的一種實現方案是:取出每一個訂單的時間字段中的「小時和分鐘」,將這個時間轉換爲距凌晨的分鐘數。如:9:00轉換後就是540,9:30轉換後就是570。
計算的過程是:
一、取定一個基線值:base=540(9:00)
二、每條條訂單記錄的分鐘數設爲:timehour
分組編號:groupid=(timehour-base)/30
這樣能夠將各個時間段內的時間統一到一個分組編號中去。以下:
時間值 groupid
9:02 0
9:23 0
9:30 1
9:31 1
10:01 3
..
這樣一來,就把各個時間段內的時間轉換成對應的某一個分組編號了,這樣咱們就能夠對每一個groupid進行分統計每一個組內的訂單數了。
時間段 groupid
9:00~9:30 0
9:30~10:00 1
10:00~10:30 2
..
下面是完整的sql語句:
select T.groupid,count(T.orderid) as number from
(
select o.orderid,o.ordertime,((datename(hh,o.ordertime)*60+datename(mi,o.ordertime))-540)/30 as groupid from orders as o
where o.ordertime<'2013-10-20 22:00' and o.ordertime>'2013-10-20 9:00'
) as T
group by T.groupid
order by groupid