2009-09-15 14 views
50

görmezden, T-SQL tarihleri ​​karşılaştırın ve ben eşitlik için iki tarihleri ​​kontrol etmek istiyorum, ama zaman parçası yok sayarak.MS SQL 2005 kullanıyorum seferinde parçasını

ben DATEDIFF yararlanabilirler biliyorum, ama bu yavaş olabileceğini endişe duyuyorum - bu SP çok DB kullanılan alır!

Herhangi bir öneriniz var mı?

Düzenleme: David Andres' yorumu:

' 'karşılaştırma' Beni yeterince sorum anlatamadım mı fark ettirdi
' eşitlik çok daha fazlasını içerir - Aslında sadece eşitlik için kontrol ediyorum, hepsi bu .

+10

Erken optimizasyonla ilgilenmeyin: 'DATEDIFF' kullanarak sorgunuzu yazın, ardından bir darboğaz olup olmadığını görün ve sorgu planını incelemeyin. Eğer sorunsa, bir alternatif arayınız. arasında – Welbog

+0

Olası kopyalar (http://stackoverflow.com/questions/1177449/best-approach-to-remove-time-part-of-datetime-in-sql- [İyi bir yaklaşımla, SQL Server datetime zaman parçası kaldırmak için] sunucu) – abatishchev

cevap

81

Bunu yapmanın tek mantıklı yolu datetime değerlerinin saat bölümünü kaldırdığını ve sonuçları ve datetime gelen saat bölümünü şerit için en iyi yolu karşılaştırmaktır şu şekildedir:

cast(current_timestamp as date)  

kullandığım ve aşağıdaki iki satır biri gibi görünüyordu bir süreç savunmak kullandı:

cast(floor(cast(getdate() as float)) as datetime) 
dateadd(dd,0, datediff(dd,0, getDate())) 

Ama şimdi SQL Server zaman bileşeni tutmaz Date türü, sahip olduğu, ya da kullanmak için çok az neden var bu tekniklerin. Burada akılda tutulması gereken

Bir şey daha, bir yerde maddelerinde veya katılmak durumda her satır için iki datetime değerleri için bunu yapmak gerekiyorsa, bu hala bir sorgu gömmeye gidiyor olmasıdır. Eğer mümkünse, örneğin bir görünümü veya hesaplanmış bir sütun kullanarak, mümkün olduğunca önceden hesaplanmış olacak şekilde, bunu bir şekilde hesaba katmak istersiniz.

Son olarak, DATEDIFF işlevi geçti sınırları sayısını karşılaştırır unutmayın. Bu nedenle, '2009-09-14 11:59:59' ve '2009-09-15 00:00:01' arasındaki günlerde, yalnızca 2 saniyelik süre geçmesine rağmen, 1 günlüğüne sahip olan tarih, '2009-09-15 00:00:01' ve '2009-09-15 11:59:59' arasındaki günlerde DATEDIFF, 86,398 saniye geçmesine rağmen hala sıfırdır. Buradaki zaman dilimiyle ilgili hiç umrumda değil. Sorgunuzun ne yapmaya çalıştığına bağlı olarak, bunu kendi avantajınıza göre kullanabileceksiniz. İki tarih eşit olduğunu belirlemek istedik Kendi eserde;

+3

, bu sadece _DATEDIFF (gün, date1, date2) _ kullanarak daha az verimli olmazdı? –

+0

Bir düzenleme üzerinde çalışıyordum - şimdi hazır. –

+2

Gerçekten zamanı soymak için bir yol aramıyordum, ama iki tarihi karşılaştırmak için zamanı görmezden gelmenin bir yolu. Bu bana biraz daha yavaş geliyor .. –

6

bakılmaksızın günün saati, ben kullandım şu: Verilen

WHERE CONVERT(VARCHAR, date1, 101) = CONVERT(VARCHAR, date2, 101) 

, "karşılaştırma" içeren eşitlik çok daha fazla ve Yukarıdaki, karşılaştırma yapmadan önce tarihleri ​​ABD/AA/GG/YYYY biçimine dönüştürür. Dolayısıyla, performans sonuçları ve tarih farklılıklarını karşılaştırmakta yetersizlik.

Ama ... işe yarıyor. ,

4

veri modeli ile iyi hizmet verilmediğini iş gereksinimlerine birinin (mesela, tarihler karşılaştırmak için bir gereksinim var, ama sadece bugüne artı kez, tarihleri ​​takibi değildir) modelin ayarlanma olasılığına bakın, onunla baş etme yöntemini değil.

bir dizine bilgisayarlı sütundaki tarih salt saklamak için ya da ayrı ayrı tarih ve saat parçaları saklamak mümkün ve yararlı olabilir mi?

33

NEREDE DATEDIFF (gün DATE1, DATE2) = 0

2

Maalesef geç cevap için.

hep tarih karşılaştırma yapmaya yönelik bu sözdizimini kullanın

WHERE CONVERT(VARCHAR(8), date1, 112) = WHERE CONVERT(VARCHAR(8), date2, 112) 

biz yyyyMMdd biçimde tarih dönmek 112 biçim kodu ile tarih dönüştürmek zaman her zaman iyi çalışıyor. dize biçimindeki tarihi zamanla karşılaştırmak değil, ancak harika çalışıyor. teşekkürler

+0

Çözümünüz, "IF date_column! = GETDATE()" olmadığında yazdığım bir betik üzerinde çalıştı. Bunun nedenini biliyor musunuz? – CryptoJones