• 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