([datetime] >= dateadd(dd, datediff(dd, 0, getdate()), 0) and [datetime] < dateadd(dd, datediff(dd, 0, getdate()) + 1, 0))
SET NOCOUNT ON;USE ProofOfConcept;GOCREATE TABLE dbo.SARGTest (DT DATETIME NOT NULL);GOCREATE CLUSTERED INDEX CID_SARGTest_DT ON dbo.SARGTest(DT);GOINSERT INTO dbo.SARGTest(DT)SELECT TOP (1000000) DATEADD(DAY, CHECKSUM(NEWID())%10000, GETDATE())FROM ProofOfConcept.dbo.Numbers AS N1CROSS JOIN ProofOfConcept.dbo.Numbers AS N2;GOSELECT *FROM dbo.SARGTestWHERE DT >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)AND DT < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 1);SELECT *FROM dbo.SARGTestWHERE CAST(DT AS DATE) = CAST(GETDATE() AS DATE);
DECLARE @S DATE = GETDATE(), @E DATE = DATEADD(DAY, 1, GETDATE());SELECT *FROM dbo.SARGTestWHERE DT >= @S AND DT < @E;
Non-Sargable: Select ... WHERE Year(date) = 2012
WHERE 2012 = Year(date)
SET NOCOUNT ON;USE ProofOfConcept;GOCREATE TABLE dbo.SARGTest (DT DATETIME NOT NULL);GOCREATE CLUSTERED INDEX CID_SARGTest_DT ON dbo.SARGTest(DT);GOINSERT INTO dbo.SARGTest(DT)SELECT TOP (1000000) DATEADD(DAY, CHECKSUM(NEWID())%10000, GETDATE())FROM ProofOfConcept.dbo.Numbers AS N1CROSS JOIN ProofOfConcept.dbo.Numbers AS N2;GOAlso tested:[code="sql"]DECLARE @S DATE = GETDATE(), @E DATE = DATEADD(DAY, 1, GETDATE());SELECT *FROM dbo.SARGTestWHERE DT >= @S AND DT < @E;
CREATE TABLE dbo.SARGTest (DT DATETIME NOT NULL, filler char(1) default ('a'));GOINSERT INTO dbo.SARGTest(DT)SELECT TOP (1000000) DATEADD(DAY, CHECKSUM(NEWID())%10000, GETDATE())FROM sys.objectsCROSS JOIN sys.objects as s2CREATE INDEX CID_SARGTest_DT ON dbo.SARGTest(DT);DECLARE @S datetime declare @E datetimeSET @S = GETDATE() SET @E = DATEADD(DAY, 1, GETDATE())--Using the varibles cause table scanSELECT *FROM dbo.SARGTestWHERE DT >= @S AND DT < @E;--Using the same values but without the varibles use a table seekSELECT *FROM dbo.SARGTestwhere DT > GETDATE() AND DT < DATEADD(DAY, 1, GETDATE())godrop table SARGTest