2012-02-14 18 views
5

最終日以降のすべてのレコードが必要ですか?このクエリでtsqlを使用して前日のレコードを取得する方法は?

こんにちは

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

、私は正確な結果を得るために、正確に真夜中の後で実行する必要があります。私は昼間にそれを実行し、すべての前日のレコードを取得する必要があります。 SQL Server 2005では

+0

([前日からすべての行を選択するためのSQL文]の可能性のある重複https://stackoverflow.com/questions/1503298/sql-statement-to-select -all-rows-from-day-day) –

答えて

7

が、これは一般的にこれまでの日時を変換するための最速の方法です:あなたのケースでは

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

、それが一度だけ行われるので、どのように本当に重要あまりないんです。しかし、それは次のクエリを提供します。

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

別の方法は、単独でDATEDIFFを使用することである:日の

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

1のDATEDIFFは、前日に任意の時間をカバーします。

+3

また、巨大な岩石でオプティマイザを吹き飛ばします。 'tabledate'フィールドが索引付けされている場合、このバージョンは索引で範囲シークを使用することはできません。代わりに、すべての一意の値に対してDATEDIFF()を計算するインデックス全体を***スキャンする必要があります。これは、検索対象のフィールドが関数呼び出しの中に隠されているためです。代替は少し長くなりますが、すべての関数呼び出しを定数に保ちますので、より高速な*** seek ***が可能になります。 – MatBailie

+0

確かに、touche。 +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

これを試してみてください:

your_field = cast(dateadd(D,-1,getdate()) as DATE) 
関連する問題