bir tarih saat alanının saat bölümünü atmak için en iyi yol DATEDIFF ve dateadd kullanırlar.
DateAdd(day, datediff(day,0, MydateValue), 0)
Bu SQL Server depolar iki tamsayılar gibi büyük gerçeği advantedge sürdüğü gün sayısını temsil eden bir gün "0" - (1 Ocak 1900) ve sayısını temsil ikincisi keneler (her kene yaklaşık 3.33 ms ) () kez gece yarısından itibaren *.
sadece yukarıdaki formül sadece ilk tamsayı okuma alır. Orada gerekli dönüşümlerin veya işleme, bu yüzden son derece hızlı.
Sorgu iyileştirici hesaplama çalıştırmak zorunda kalmaması sorgularınızın bir dizin kullanmak yapmak için ..., veya tablolar tarih saat alanından eşittir işaretinin "öteki" tarafında ilk parametre filtreleme girdi bu formülü kullanın tablodaki her tarih saat alanda satırlar filtre koşulu karşılayan belirlenmesi. Bu arama argüman yapar "SARG-able" (Arama argüman)
Where MyDateTimeColumn > DateAdd(day,
datediff(day,0, @MydateParameter), 0) -- SARG-able
ziyade
Where DateAdd(day, datediff(day,0,
MyDateTimeColumn ), 0) > @MydateParameter -- Not SARG-able
* NOT. Dahili olarak, ikinci tamsayı (zaman parçası) depolar keneler. Bir günde 24 x 60 x 60 x 300 = 25.920.000 kene (tesadüfen sadece maksimum değerin altında bir 32 bit tamsayı tutabilir) vardır. Ancak, aritmetik olarak tarihsaat gelen değerler ekleyerek veya çıkararak zaman bir gün kesirli kısmı tam olarak eşit olsa gibi sanki, kesir olarak değeri davranabilirsiniz ... Bir datetime değiştirirken bu konuda endişelenmenize gerek yok tam tarih saat değeri tarih ve saati temsil eden kısmi bölümünü) temsil eden bir tamsayıdır kısımdan teşekkül eden bir kayan nokta sayısı oldu. yani
`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`