2012-02-14 8 views
5

Tôi cần tất cả các hồ sơ từ ngày trước?làm thế nào để có được hồ sơ của ngày trước đó bằng cách sử dụng tsql?

Hi

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

với truy vấn này, tôi cần phải chạy là chính xác sau nửa đêm để có được kết quả chính xác. Tôi cần phải chạy nó trong thời gian ngày và nhận được tất cả các hồ sơ của ngày hôm trước.

+0

có thể trùng lặp của [câu lệnh SQL để chọn tất cả các hàng từ ngày hôm trước] (https://stackoverflow.com/questions/1503298/sql-statement-to-select -all-rows-from-before-day) –

Trả lời

7

Trong SQL Server 2005, điều này thường là cách nhanh nhất để chuyển đổi một datetime đến một ngày:

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

Trong trường hợp của bạn, nó được thực hiện một lần duy nhất, do đó như thế nào không thực sự quan trọng hơn nhiều. Nhưng nó cung cấp cho các truy vấn sau đây.

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

phương pháp khác là sử dụng một mình DATEDIFF:

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

Một datediff trong tổng số 1 cho ngày bao gồm bất kỳ thời gian trong ngày hôm trước.

+3

Và nó cũng sẽ đánh bại người tối ưu với một tảng đá khổng lồ. Nếu trường 'tabledate' được lập chỉ mục, phiên bản này sẽ * không * có thể sử dụng phạm vi tìm kiếm trên chỉ mục. Thay vào đó nó sẽ cần phải *** quét *** toàn bộ chỉ mục tính toán DATEDIFF() trên mọi giá trị duy nhất. Điều này là do trường đang được tìm kiếm hiện bị ẩn bên trong cuộc gọi hàm của bạn. Cách thay thế hơi dài hơn, nhưng giữ tất cả các cuộc gọi hàm trên hằng số, và vì vậy cho phép tìm kiếm *** nhanh hơn nhiều. – MatBailie

+0

Thật vậy, hãy chạm vào. Đã +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

Hãy thử điều này:

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