• Incidentally, if you're using SQL 2005, you can jump straight to the final result fairly elegantly.

    Code is safe to run...

     

    DECLARE @MY_EVENTS TABLE (DESCRIPTION VARCHAR(50), STARTING_TIME DATETIME, ENDING_TIME DATETIME)

    INSERT @MY_EVENTS

          SELECT 'James Bond',  '20070701 10:30', '20070701 11:00'

    UNION SELECT 'Sally May',   '20070701 11:30', '20070701 13:30'

    UNION SELECT 'Jerry Jones', '20070701 11:30', '20070701 12:30'

    UNION SELECT 'Mike Moxie',  '20070701 12:30', '20070701 13:00'

    UNION SELECT 'Carl Cluff',  '20070701 12:30', '20070701 14:00'

    UNION SELECT 'Mad Max',     '20070701 14:00', '20070701 14:30';

     

    --e) output is 4 rows

    WITH

        INTEGERS AS (SELECT DISTINCT colid i FROM syscolumns WHERE colid BETWEEN 1 AND 24),

        HOURS AS (SELECT DATEADD(hh, i-1, '20070701') BEGIN_HOUR, DATEADD(hh, i, '20070701') END_HOUR FROM INTEGERS),

        DAYHOURS AS (

            SELECT DESCRIPTION, STARTING_TIME, ENDING_TIME, BEGIN_HOUR,

                DATEDIFF(mi,

                CASE WHEN BEGIN_HOUR < STARTING_TIME THEN STARTING_TIME ELSE BEGIN_HOUR END,

                CASE WHEN END_HOUR > ENDING_TIME THEN ENDING_TIME ELSE END_HOUR END) AS IDURATION

            FROM @MY_EVENTS, HOURS

            WHERE NOT (ENDING_TIME <= BEGIN_HOUR OR STARTING_TIME >= END_HOUR))

    SELECT * FROM DAYHOURS WHERE BEGIN_HOUR = (SELECT TOP 1 BEGIN_HOUR FROM DAYHOURS GROUP BY BEGIN_HOUR ORDER BY COUNT(*) DESC)

     

    /*

    DESCRIPTION          STARTING_TIME           ENDING_TIME             BEGIN_HOUR              IDURATION

    -------------------- ----------------------- ----------------------- ----------------------- -----------

    Carl Cluff           2007-07-01 12:30:00.000 2007-07-01 14:00:00.000 2007-07-01 12:00:00.000 30

    Jerry Jones          2007-07-01 11:30:00.000 2007-07-01 12:30:00.000 2007-07-01 12:00:00.000 30

    Mike Moxie           2007-07-01 12:30:00.000 2007-07-01 13:00:00.000 2007-07-01 12:00:00.000 30

    Sally May            2007-07-01 11:30:00.000 2007-07-01 13:30:00.000 2007-07-01 12:00:00.000 60

    */

     

     

    Ryan Randall

    Solutions are easy. Understanding the problem, now, that's the hard part.