SQL Server 2008 Group by 30 minute Time Intervals
Just this...

SELECT
    'DATE' = CONVERT(VARCHAR(12), CAST(x30.ActionDateTime AS date), 101),
    'TIME' = CAST(DATEPART(HOUR, x30.ActionDateTime) AS char(2)) + ':' + CAST(DATEPART(MINUTE, x30.ActionDateTime)/30 AS char(2),
    ...

GROUP BY
    CAST(x30.ActionDateTime AS date),
    DATEPART(HOUR, x30.ActionDateTime),
    DATEPART(MINUTE, x30.ActionDateTime)/30