2012-02-14 12 views
5

Son günden itibaren tüm kayıtlara ihtiyacım var? Bu sorgu ileBir önceki günün kayıtlarını tsql kullanarak nasıl edinebilirim?

Merhaba

Select * from table1 where tabledate > getdate() -1 

i tam olarak gece yarısından sonra kesin sonuç almak için çalıştırmak gerekir. Onu gün içinde çalıştırmam ve önceki günün kayıtlarını almam gerek. SQL Server 2005'te

+0

([önceki haftanın tüm satırları seçmek için SQL deyimi] Olası yinelenen https://stackoverflow.com/questions/1503298/sql-statement-to-select -tüm-gün-satır-önceki-gün) –

cevap

7

, bu genellikle bir tarihe bir datetime dönüştürmek için en hızlı yoludur: Senin durumunda

DATEADD(day, DATEDIFF(day, 0, yourDate), 0) 

, sadece bir defa yapılır, öyle değil nasıl yaptığını gerçekten çok önemli. Ama şu sorguyu veriyor.

Select 
    * 
from 
    table1 
where 
     tabledate >= DATEADD(day, DATEDIFF(day, 0, getDate()) - 1, 0) 
    AND tabledate < DATEADD(day, DATEDIFF(day, 0, getDate()),  0) 
0

diğer bir yöntem, tek başına DATEDIFF kullanmaktır:

SELECT * FROM table1 
WHERE DATEDIFF(DAY, tabledate, GETDATE()) = 1 

gün için 1 bir datediff önceki gün her zaman kapsar.

+3

Ve ayrıca büyük bir kaya ile optimiser bludgeon olacak. 'Tabledate 'alanı endekslendiyse, bu versiyon indekste bir dizi aramayı * kullanamaz. Bunun yerine, her bir değerin üzerinde DATEDIFF() değerini hesaplayan tüm indeksi *** taraması gerekecektir. Bunun nedeni, aranan alanın artık işlev çağrınızın içinde gizli kalmasıdır. Alternatif biraz daha uzun, ancak tüm işlev çağrılarını sabitler üzerinde tutar ve böylece çok daha hızlı bir şekilde *** aramasına izin verir. – MatBailie

+0

Gerçekten, touche. + 1'lediniz – Bort

0
DECLARE @d SMALLDATETIME; 
SET @d = DATEDIFF(DAY, 0, GETDATE()); 

SELECT <cols> FROM dbo.table1 
    WHERE tabledate >= DATEADD(DAY, -1, d) 
    AND tabledate < @d; 
0

bu deneyin:

your_field = cast(dateadd(D,-1,getdate()) as DATE) 
İlgili konular