2012-02-14 4 views
5

Potrzebuję wszystkich rekordów z ostatniego dnia?jak uzyskać zapisy z poprzedniego dnia za pomocą tsql?

Hi

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

z tego zapytania, trzeba uruchomić się dokładnie po północy, aby uzyskać dokładny wynik. Muszę go uruchomić w ciągu dnia i zdobyć wszystkie poprzednie zapisy.

+0

Możliwy duplikat [SQL, aby zaznaczyć wszystkie wiersze z dnia poprzedniego] (https://stackoverflow.com/questions/1503298/sql-statement-to-select -wszystkie rzędy-od-poprzedniego-dnia) –

Odpowiedz

7

W SQL Server 2005, na ogół jest to najszybszy sposób, aby przekonwertować datetime do daty:

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

W twoim przypadku, to zrobić tylko raz, więc jak nie ma to większego znaczenia. Ale daje następujące zapytanie.

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

Inna metoda polega na użyciu DATEDIFF sam:

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

DateDiff od 1 dnia obejmuje każdy czas w poprzednim dniu.

+3

I to także bludgeon optimimiser z ogromnym kamieniem. Jeśli pole 'tabledate' jest zindeksowane, ta wersja * nie * będzie mogła użyć szukania zakresu w indeksie. Zamiast tego będzie musiał *** skanować *** cały indeks obliczający DATEDIFF() na każdą unikalną wartość. Dzieje się tak dlatego, że szukane pole jest teraz ukryte w twoim wywołaniu funkcji. Alternatywa jest nieco dłuższa, ale utrzymuje wszystkie funkcje na stałych, a więc pozwala na znacznie szybsze *** szukanie ***. – MatBailie

+0

Rzeczywiście, dotknij. +1 – 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

Spróbuj tego:

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