De meest redelijke manier om dit te doen is om het tijdgedeelte van de datetime-waarden te verwijderen en de resultaten te vergelijken, en de beste manier om het tijdgedeelte van een datetime te verwijderen is als volgt:
cast(current_timestamp as date)
Ik gebruikte en pleitte voor een proces dat eruitzag als een van de volgende twee regels:
cast(floor(cast(getdate() as float)) as datetime)
dateadd(dd,0, datediff(dd,0, getDate()))
Maar nu Sql Server de Date
. heeft type, dat geen tijdcomponent bevat, is er weinig reden om een van deze technieken te gebruiken.
Nog iets om in gedachten te houden is dat dit nog steeds een query zal doen vastlopen als je het moet doen voor twee datetime-waarden voor elke rij in een where-clausule of join-voorwaarde. Indien mogelijk wilt u dit op de een of andere manier buiten beschouwing laten, zodat het zo veel mogelijk vooraf wordt berekend, bijvoorbeeld met behulp van een weergave of berekende kolom.
Merk ten slotte op dat de DATEDIFF-functie het aantal overschreden grenzen vergelijkt. Dit betekent de datediff in dagen tussen '2009-09-14 11:59:59'
en '2009-09-15 00:00:01'
is 1, ook al zijn er slechts 2 seconden verstreken, maar de DATEDIFF in dagen tussen '2009-09-15 00:00:01'
en '2009-09-15 11:59:59'
is nog steeds nul, ook al zijn er 86.398 seconden verstreken. Het geeft niet echt om het tijdsgedeelte daar, alleen om de grenzen. Afhankelijk van wat uw vraag probeert te doen, kunt u daar mogelijk uw voordeel mee doen.