You didn't give much to work with, but here's an example of how I'd do this given your dimTime table is similar to ones I usually use. Also I'm using the [Whatever] table to denote occurrences during specific times:
-- Setup Whatever Table
CREATE TABLE Whatever (TimeDateKey DATETIME, Occurrence INTEGER);
INSERT INTO Whatever (TimeDateKey, Occurrence) VALUES
('2013-12-25 09:11',1),
('2013-12-25 10:15',1),
('2013-12-25 10:44',1),
('2013-12-25 11:43',1)
-- Setup Time Dimention
DECLARE @TimeLoop TIME = '00:01'
CREATE TABLE dimTime (TimeKey TIME, TimeHour INTEGER, TimeMinute INTEGER, PartOfDay CHAR(2))
INSERT INTO dimTime (TimeKey, TimeHour, TimeMInute, PartofDay) VALUES ('00:00',0,0,'AM')
WHILE @TimeLoop <> '00:00'
BEGIN
INSERT INTO dimTime (TimeKey, TimeHour, TimeMInute, PartofDay) VALUES (
@TimeLoop,
DATEPART(HOUR,@TimeLoop),
DATEPART(Minute,@TimeLoop),
CASE WHEN @TimeLoop < '12:00' THEN 'AM' ELSE 'PM' END)
SET @TimeLoop = DATEADD(Minute,1,@TimeLoop)
END
-- Query
DECLARE@StartTime DATETIME = '2013-12-25 08:00',
@EndTime DATETIME = '2013-12-25 14:00';
WITH OutputTable ([Hours],[Occurrences]) as (
SELECT'Hour_' + RIGHT('0' + CONVERT(VARCHAR(2),t.TimeHour),2) AS [Hours],
COUNT(w.Occurrence) as [Occurrences]
FROMdimTime t
LEFT OUTER JOIN Whatever w ON
DATEPART(hour,w.TimeDateKey) = t.TimeHour
WHEREt.TimeHour BETWEEN DATEPART(HOUR,@StartTime) AND DATEPART(HOUR,@EndTime) AND
t.TimeMinute = 0
GROUP BY 'Hour_' + RIGHT('0' + CONVERT(VARCHAR(2),t.TimeHour),2))
SELECT[Hours],
CASE WHEN [Occurrences] = 0 THEN 0 ELSE 1 END AS [Occurrences]
FROMOutputTable
-- Cleanup
DROP TABLE Whatever
DROP TABLE dimTime
The output will be this:
Hours Occurrences
Hour_08 0
Hour_091
Hour_101
Hour_111
Hour_120
Hour_130
Hour_140