endeksli aramalarını, sadece tarih parçalarını karşılaştırmak için SQL server datetime alanları dönüştürme

oy
28

Bir yapıyorum convert(varchar,datefield,112)eksik değil sadece tarih muhasebesi ediyorum sağlamak için SQL server sorguları 'arasındaki' kullanarak ve kulüpler her tarih alanına herhangi datetime alanların zaman parçası dayalı.

Şimdi, dönüştürür indeksli olmadıklarını ve tarihleri ​​aralığında düşmek olmadığını belirlemek için bir sorguda tarihsaat tarih bölümünü karşılaştırmak için SQL Server 2005'te daha iyi yöntemler, olduğunu duyuyorum.

Böyle bir şey yapmanın en uygun, çift taraflı, yöntemi nedir:

select * from appointments
where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'
Oluştur 09/12/2008 saat 15:59
kaynak kullanıcı
Diğer dillerde...                            


5 cevaplar

oy
2

Doğru değil - dönüşüm yaparak sorgulanan her satır için dönüşüm çalıştırır. Bu tarihleri ​​gibi tarihi sütunları bırakın ve tarihleri ​​gibi nereye maddelerinde geçmek iyidir:

select * from appointments where appointmentdate between 
'08/01/2008' AND '08/16/2008'

zaman kapalı bırakılması gece yarısı (00: 00.000) anlamı: Not, bu nedenle tam olarak 2008/08/16 00:00:00 olup 08/01 için tüm zamanlar ve 08/15 tüm saatlerini ve her şeyi içerecek

Cevap 09/12/2008 saat 16:06
kaynak kullanıcı

oy
65

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`
Cevap 09/12/2008 saat 16:07
kaynak kullanıcı

oy
1

Bir sütun İhtiyacınız ifadesini hesaplamak kalıcı hesaplanmış mı. sütunlar hesaplanır ve kalıcı, bunlar da dizine eklenebilir.

Cevap 09/12/2008 saat 16:10
kaynak kullanıcı

oy
5

dize değerlerine sayısal türleri (Boks türü) dönüştürme Eğer aradığınızı yapmanın en iyi performans gösteren bir yöntem değildir. Onun gerçekten gerçek kolon tipi tarih saat olduğu için, endeks-muktedir hakkında.

tarihlere ait en iyi yolu sorgusu için arıyorsanız, o zaman örnek haklı, ama dikkate MSSQL 3 ms hassas farkını almak isteyebilirsiniz. O günden güne kayıtları başka günün sonucu görünebilir anlamına gelebilir.

Bu

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<'08-15-2008'

Bu olmalı

select * from appointments where appointmentDate>='08-01-2008' and appointmentDate<='08-14-2008 23:59:59.996'
Cevap 09/12/2008 saat 16:11
kaynak kullanıcı

oy
0

Adresinde açıklanan yolu da vardır http://www.stillnetstudios.com/comparing-dates-without-times-in-sql-server/

SELECT CAST(FLOOR(CAST( getdate() AS float )) AS datetime)
Cevap 28/09/2011 saat 13:31
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more