Consider backing up (always back up) first to another table or otherwise as delete recovery is quite expensive. Disclaimer: I did NOT test these and this is just a super quick post here. Always test prior to any execution against production data.
This should do the trick but you may consider a smaller chunk size. This may or may not perform well in your circumstance;
WHILE EXISTS (SELECT * FROM db.dbo.table WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP))
BEGIN
BEGIN TRANSACTION
DELETE TOP (100000)
FROM db.dbo.table
WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP)
COMMIT TRANSACTION
END
CTE Example (might consider a smaller size of deletions) This has the advantage of working from the oldest date forward;
WHILE EXISTS (SELECT * FROM db.dbo.table WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP))
BEGIN
BEGIN TRANSACTION
;WITH deleteCTE AS (
SELECT TOP (100000) *
FROM db.dbo.table
WHERE [DateIn] <= DATEADD(DAY, -1000, CURRENT_TIMESTAMP)
ORDER BY [DateIn] ASC)
DELETE FROM deleteCTE;
COMMIT TRANSACTION
END
Consider alternatives such as creating a table with a set of ID's to delete with some sort of "group indicator" for dates/groups and walking through that with a join; things like that.