De beste manier om het tijdgedeelte van een datetime-veld te verwijderen, is door de functies datediff en dateadd te gebruiken.
DateAdd(day, datediff(day,0, MydateValue), 0)
Dit maakt gebruik van het feit dat SQL Server datums opslaat als twee gehele getallen, waarbij één het aantal dagen sinds dag "0" - (1 jan 1900) vertegenwoordigt en de tweede het aantal ticks
de bovenstaande formule hoeft alleen maar het eerste gehele getal te lezen. Er is geen conversie of verwerking vereist, dus het is extreem snel.
Om uw query's een index te laten gebruiken... gebruikt u eerst deze formule op de invoerfilterparameters, of aan de "andere" kant van het gelijkteken van het datum-tijdveld van de tabellen, zodat de query-optimizer de berekening niet hoeft uit te voeren op elk datetime-veld in de tabel om te bepalen welke rijen voldoen aan het filterpredikaat. Dit maakt uw zoekargument "SARG-able" (Search ARgument)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
in plaats van
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* OPMERKING. Intern slaat het tweede gehele getal (het tijdsdeel) ticks op. In een dag zijn er 24 x 60 X 60 X 300 =25.920.000 teken (toevallig net onder de maximale waarde die een 32-bits geheel getal kan bevatten). U hoeft zich hier echter geen zorgen over te maken bij het rekenkundig wijzigen van een datetime... Bij het optellen of aftrekken van waarden van datetimes kunt u de waarde als een breuk behandelen alsof deze exact gelijk is aan het fractionele deel van een dag, alsof de volledige datetime-waarde was een getal met drijvende komma dat bestond uit een geheel getal dat de datum vertegenwoordigt en het fractionele deel dat de tijd vertegenwoordigt). d.w.z.
`Declare @Dt DateTime Set @Dt = getdate()
Set @Dt = @Dt + 1.0/24 -- Adds one hour
Select @Dt
Set @Dt = @Dt - .25 -- Moves back 6 hours
Select @Dt`