2009-10-19 32 views
20

Trong bảng trong datatase của tôi, tôi có một cột dữ liệu lưu trữ thời gian mà bản ghi được thêm vào. Làm thế nào tôi có thể xóa tất cả các bản ghi cũ hơn một ngày khi tôi chạy một thủ tục được lưu trữ (xem xét thời gian hiện tại)?Xóa các mục cũ hơn một ngày - SQL Server

Trả lời

28

Bạn có thể tạo tuyên bố DELETE khi sử dụng các chức năng datediffgetdate. Ví dụ

Cách sử dụng:

DELETE FROM yourTable WHERE DATEDIFF(day,getdate(),thatColumn) < -1 
+2

Bạn nhận được điều này ngược. Dựa trên câu hỏi, "thatColumn" sẽ luôn trong quá khứ và cách bạn đã viết điều này, DATEDIFF của bạn sẽ luôn lớn hơn 0. Cách chính xác là: "DELETE FROM yourTable WHERE DATEDIFF (ngày, getdate(), thatColumn) <-1 " Hoặc:" DELETE FROM yourTable WHERE DATEDIFF (ngày, thatColumn, getdate())> 1 " –

5
Delete <TableName> 
Where DATEDIFF(day, <ColumnName>, getdate()) > 0 

Raj

+0

bạn có thể đã quên 'FROM';) – KB22

+3

Từ không bắt buộc với tuyên bố xóa :) – Raj

+1

+ 1, d'oh của tôi. ^^ – KB22

0

tôi thường tư vấn chống lại thực sự xóa dữ liệu từ cơ sở dữ liệu của bạn bởi vì bạn không bao giờ biết khi nào bạn có thể cần phải quay trở lại và phục hồi hoặc rollback đến kỷ lục trước đó vì tham nhũng dữ liệu hoặc kiểm toán, vv Thay vào đó, tôi sẽ thêm tiêu đề cột bit giống như "IsDeleted" và đặt các mục cũ trong ngày thành true bằng cách sử dụng câu lệnh cập nhật.

Something như

'UPDATE tablename SET IsDeleted = 1 WHERE (DATEDIFF(day,DateCreatedOn,GETDATE()) > 0) 

đâu DateCreatedOn là nơi đã tạo ra trên hoặc ngày timestamp sẽ đi

+3

Đây là một khái quát khó mà không biết vấn đề được đặt ra. Có nhiều lý do chính đáng để xóa dữ liệu là không. Nếu bạn cần khôi phục hoặc khôi phục, đó là lý do tại sao bạn có bản sao lưu. Nếu hoạt động chuẩn của ứng dụng có nghĩa là bạn không còn cần dữ liệu nữa, hãy xóa dữ liệu. – Joe

+0

Nếu bạn không bao giờ xóa dữ liệu, cuối cùng - chắc chắn - các bảng quá đông sẽ dẫn đến hiệu suất bị suy giảm. Nếu bạn phải giữ dữ liệu "nóng", sao chép dữ liệu vào bảng lưu trữ và sau đó xóa khỏi nguồn, có thể sau giờ làm việc, phải là một lựa chọn khả thi. –

+0

Tôi thừa nhận đó là một chút quá nhiệt tình, nhưng tốt hơn là có nó và không cần nó, sau đó không có nó và cần nó. Hãy tưởng tượng loại phản hồi bạn nhận được từ khách hàng nói rằng họ cần tất cả hồ sơ bán hàng từ đơn đăng ký thương mại điện tử của họ trong 5 năm qua và phản hồi của bạn đối với họ là "Chúng tôi đã xóa nó vì cũ và hiện không cần thiết ứng dụng". Chỉ vì bản thân ứng dụng có thể không cần dữ liệu, điều đó không có nghĩa là ứng dụng khách không cần nó và có thể thực hiện mà không cần. –

-1

hoặc

ts> = tại hồ sơ của bạn() - INTERVAL 1 NGÀY

trong đó ts là tên của cột ngày giờ

+1

Và các công trình của anh ta trên SQL Server? – gbn

+0

Có. Ít nhất là trên MySQL. – Zepplock

+0

Vì vậy, vui lòng đọc tài liệu trước -1 người khác – Zepplock

28

Khi nói đến SQL, bạn phải chỉ định ý nghĩa của từ "cũ hơn một ngày".

  • DATEDIFF: nó sử dụng nửa đêm ranh giới ngày vì vậy hãy chạy nó ở 19 tháng 10 00:05 và bạn sẽ xóa hàng phút 6 tuổi (18 tháng 10 23:59)

  • 24 giờ?

  • Hôm qua nửa đêm? Chạy mã vào ngày 19 tháng 10, xóa hàng trước ngày 18?

Ngoài ra, không đặt hàm trên cột.

này giả 24 giờ đến phút:

DELETE 
    MyTableWhere 
WHERE 
    MyColumn < DATEADD(day, -1, GETDATE()) 

này giả hôm qua nửa đêm:

DELETE 
    MyTableWhere 
WHERE 
    MyColumn < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), -1) 
0

Giả sử cột ngày là "RecordCreatedDate"

DELETE FROM yourtable ĐÂU RecordCreatedDate < DATEADD (d, -1, GETDATE())

Tôi chỉ lưu ý rằng nếu cơ sở dữ liệu của bạn có hàng triệu hàng, bạn nên có chỉ mục trên cột RecordCreatedDate và có thể thực hiện xóa hàng loạt nhỏ hơn nếu bạn sẽ loại bỏ một lượng lớn dữ liệu.

0

xóa khỏi Bảng điều khiển của bạn trong đó DateColumn < getdate() - 1

Các vấn đề liên quan