--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 

--1, Pure string manipulation 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"


--2, DATEADD alternative, with both 0 and '' as reference date
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 1"


--DATEADD alternative, with '20040101' consistently as reference date
SET @t GETDATE() 

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

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


--DATEADD alternative, with 0 consistently as reference date
SET @t GETDATE() 

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

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