SELECT CAST(dt.date1 + dt.min1 AS datetime) as Begins, DATEADD( mi,10, CAST(dt.date1 + dt.min1 AS datetime)) AS Ends, COUNT(*) as total FROM (SELECT proc_dt, RIGHT(CONVERT( CHAR(8), proc_dt,108),5) as Time1, CONVERT( CHAR(14), proc_dt,120) date1, CASE WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '50:00' THEN '50:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '40:00' THEN '40:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '30:00' THEN '30:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '20:00' THEN '20:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '10:00' THEN '10:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '00:00' THEN '00:00' ELSE '??:??' END min1 FROM orders WHERE proc_dt IS NOT NULL) dt GROUP BY CAST(dt.date1 + dt.min1 AS datetime), DATEADD( mi,10, CAST(dt.date1 + dt.min1 AS datetime)) ORDER BY 1 -- or combaining things together SELECT dt.IntervalBegins, DATEADD( mi,10, IntervalBegins) AS IntervalEnds, COUNT(*) as total FROM (SELECT CAST( CONVERT( CHAR(14), proc_dt,120) + CASE WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '50:00' THEN '50:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '40:00' THEN '40:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '30:00' THEN '30:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '20:00' THEN '20:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '10:00' THEN '10:00' WHEN RIGHT(CONVERT( CHAR(8), proc_dt,108),5) > '00:00' THEN '00:00' ELSE '??:??' END AS datetime ) AS IntervalBegins FROM orders WHERE proc_dt IS NOT NULL) dt GROUP BY IntervalBegins, DATEADD( mi,10, IntervalBegins) ORDER BY 1You convert datime field proc_dt into beginnig of the interval and than group by it.