--Test to assess the perf difference between string method vs DATEADD method 
--to set time portion to zero.
USE tempdb
GO

--load lots of rows
IF OBJECT_ID('dbo.date_table'IS NOT NULL DROP TABLE dbo.date_table
GO

--10000000 rows will blow up tempdb data file to about 200MB
SELECT TOP 10000000 GETDATE() AS date_time
INTO dbo.date_table
FROM master.dbo.spt_values t1
CROSS JOIN master.dbo.spt_values t2
CROSS JOIN master.dbo.spt_values t3
WHERE t1.name IS NOT NULL
   AND 
t2.name IS NOT NULL 
   AND 
t3.name IS NOT NULL;
GO

DECLARE @t datetime

--DATEADD alternative
SET @t GETDATE()

SELECT 
 
DATEADD(DAY0DATEDIFF(DAY''date_time))
,
COUNT(*)
FROM dbo.date_table
GROUP BY DATEADD(DAY0DATEDIFF(DAY''date_time))
OPTION (MAXDOP 1);

SELECT DATEDIFF(ms@tGETDATE()) AS "DATEADD alternative"



--String alternative
SET @t GETDATE()

SELECT 
 
CONVERT(CHAR(8), date_time112)
,
COUNT(*)
FROM dbo.date_table
GROUP BY CONVERT(CHAR(8), date_time112)
OPTION (MAXDOP 1);

SELECT DATEDIFF(ms@tGETDATE()) AS "String alternative"