2012-02-14 6 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) 
관련 문제