你有不規則的時間段(有些是15分鐘的長度,其他的是1小時的長度,其他的是幾個小時的長度)。在這種情況下,你能做的最好的運行與case語句的查詢:
with thetable as
(
SELECT 'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT 'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT 'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5
)
SELECT '07:00 - 07:15' interval, sum(case when CONVERT(varchar, date, 108) between '07:00:00' AND '07:14:59' then 1 else 0 end) counting
FROM thetable
union
select '07:15 - 08:00', sum(case when CONVERT(varchar, date, 108) between '07:15:00' AND '07:59:59' then 1 else 0 end)
from thetable
union
select '08:00 - 09:00', sum(case when CONVERT(varchar, date, 108) between '07:59:59' AND '08:59:59' then 1 else 0 end)
from thetable
現在,如果你確實有定期,你會做這樣的事情:
select counting,
dateadd(ms,500-((datepart(ms,interval)+500)%1000),interval) intini
from
(
SELECT COUNT(1) counting, CONVERT(datetime, round(floor(CONVERT(float, date) * 24 * 4)/(24 * 4), 11)) interval
FROM
(
SELECT 'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT 'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT 'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5
) thetable
group by FLOOR(CONVERT(float, date) * 24 * 4)
) thetable2
注意24 * 4是15分鐘的時間間隔。如果你的間隔時間是1小時,你應該用24代替。如果你的間隔時間是10分鐘,那應該是24 * 6。我認爲你得到了這張照片。
這是不是多餘的: datepart(mi,DateTimeColumn)/ @interval * @interval 如果按區間劃分,然後按時間劃分,那麼您實際上留下的是開頭的東西嗎? – Dhiren 2011-04-15 14:48:53
@DHiren :如果它是整數除法,並且小數被截斷;本質上它變成了一個週期性的Floor()函數,你不會提到哪個Sybase數據庫,但是在ASE SELECT 7/5 * 5中返回5,因爲7/5部分被截斷爲1,因爲它被轉換爲整數。 – Terry 2011-04-15 16:11:37
@Terry:這幾乎是我所需要的,除非它不產生滾動的總和,但我可以在代碼後面做到這一點,謝謝! – Dhiren 2011-04-15 16:34:55