2010-10-31 50 views
0

我有一個表,基本上存儲某些數據集的修訂(即如果你喜歡,通過時間編輯回來)。修訂日期被無意識地存儲爲名爲revisiondatetime字段。基於分層日期時間的刪除T-SQL

每天都會在午夜時分進行新的修訂。

如果該表被留下來填充,則每一天都會有一組行,其中每組行共享相同的日期時間字段,例如, 2010-10-31 00:00:00

我希望將存儲過程實現爲基本每天運行的作業,並根據類似於Time Machine功能在OS X中的工作方式的標準清理此表中的修訂數。即,修訂版要保持應該是:每天在過去的一週

  • 一個版本(因爲低於每週一次修訂),每星期,每星期之後,這個(午夜星期一早上修訂)
  • 一個版本
  • 一個版本每月修訂超過一年(每月第一天的午夜修訂)

因此,舉例來說,現在我希望看到如下的修訂:

  • 2010-10-30(日)
  • 2010-10-29(日)
  • 2010-10-28(每日)
  • 2010-10-27(每日)
  • 2010-10-26(每日)
  • 2010-10-25(每日/每週)
  • 2010-10-18(每週)
  • 2010-10-11(每週)
  • 2010-10-04(每週)
  • 2010-09-27(每週)
  • ...

這當然要記住我的數據集還沒有一年。

那麼,什麼是最好,最簡潔的DELETE FROM來實現這一目標?謝謝!

+0

我們不爲你建造它 - 你試過了什麼? – 2010-10-31 19:43:20

回答

0

以每種情況下

  • 最後weeek:只過濾< DATEADD(day, -8, GETDATE())因爲不需要處理。 (允許時間分量並假定在午夜後運行清理)

  • 一週前一年前:使用DATEPART(weekday, revision) <> 2。取決於@@ datefirst。比去年同期

  • 更多:使用DATEPART(day, revision) <> 1

所以,類似但未經檢驗...

DELETE 
    MyTable 
WHERE 
    Revision < DATEADD(day, -8, GETDATE()) 
    AND 
    (
    Revision > DATEADD(year, -1, GETDATE()) AND DATEPART(weekday, revision) <> 2 
    OR --Must be > 1 year ago) 
    Revision < DATEPART(month, revision) <> 1) 
    ) 
+0

謝謝 - 工作日datepart是我缺少的鏈接。 – 2010-10-31 20:45:21