Det mest rimliga sättet att göra detta är att ta bort tidsdelen av datetime-värdena och jämföra resultaten, och det bästa sättet att ta bort tidsdelen från en datetime är så här:
cast(current_timestamp as date)
Jag brukade använda och förespråka en process som såg ut som en av följande två rader:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Men nu när SQL Server har Date
typ, som inte innehåller en tidskomponent, finns det ingen anledning att använda någon av dessa tekniker.
En sak till att komma ihåg är att detta fortfarande kommer att försvinna en fråga om du behöver göra det för två datetime-värden för varje rad i en where-sats eller join-villkor. Om möjligt vill du ta bort detta på något sätt så att det är förberäknat så mycket som möjligt, till exempel med hjälp av en vy eller beräknad kolumn.
Notera slutligen att DATEDIFF-funktionen jämför antalet gränser som passerats. Detta betyder datediff i dagar mellan '2009-09-14 11:59:59'
och '2009-09-15 00:00:01'
är 1, trots att bara 2 sekunder har gått, men DATEDIFF i dagar mellan '2009-09-15 00:00:01'
och '2009-09-15 11:59:59'
är fortfarande noll, trots att 86 398 sekunder har gått. Det bryr sig egentligen inte alls om tidsdelen där, bara gränserna. Beroende på vad din fråga försöker göra, kanske du kan använda det till din fördel.