2011-06-14 38 views
2

我工作的一個存儲過程,需要歷時9個月的數據。需要一個語法,它會自動刪除,當新數據將被添加到表中的最早的數據(最新9個月數據)。如何讓過去的9個月的數據?

這句法會在選擇語法中使用。

我用

select * from tablename t 
left outer join calendartable r on 
t.fiscal_month=r.fiscal_month 
where t.date > dateadd(m,-9,date) 

我知道這是錯誤的。你能幫我解決這個問題嗎?

感謝

+0

通常,使用代碼標籤格式化代碼幷包含表結構的想法是一個好主意。 – JNK 2011-06-14 15:41:40

+0

我知道它容易讓你們也爲更好地理解.. – Shahsra 2011-06-14 15:44:53

+0

小的修改我的問題,如果我們有一個日期,然後回答以下問題,將工作。但是如果我們有[Fiscal_Month]而不是[Date],那麼呢? [Fiscal_Month]的例子就像這個'2012M03','2011M05'等,然後dateadd(m,-9,date)語法不會在那裏工作..我們還能做什麼? – Shahsra 2011-06-14 18:17:23

回答

5

你可能想GETDATE從現在開始計算九個月邊界:

where t.date >= dateadd(m,-9, GETDATE()) 

請注意,如果t.date是日期和時間字段不只是約會,你會看到奇怪的行爲在九個月的邊界上,除非你也在比較之前捨棄了時間。

或者,如果你比較它與另一個值如插入的記錄在你的觸發器中的日期,那麼你得到的可能是好的,例如,像

declare @latest date 
select @latest = inserted.date 
delete from ... where t.date < dateadd(m, -9, @latest) 

雖然我建議你居然歸檔關數據,而不是將其刪除。


既然你已經明確你想要整整兩個月,即從上月底9個月,你可以使用

declare @today date; 
declare @firstOfMonth date; 
declare @nineMonthsAgo date; 
set @today = GETDATE(); 
set @firstOfMonth = DATEADD(d, 1-DAY(@today), @today); 
set @nineMonthsAgo = DATEADD(m, -9, @firstOfMonth); 

... WHERE date >= @nineMonthsAgo AND date < @firstOfMonth 
+0

+1打我吧... – Moose 2011-06-14 15:45:59

+0

感謝您的回覆...我看到你已經把getdate()置於頂端..如果我們需要從今天的日期數據是好事..如果我們想要數據上個月2011年5月31日.. – Shahsra 2011-06-14 16:09:53

1

好像它是相當接近。你現在需要9個月還是9個月?

怎麼樣:

declare @date datetime 

set @date = dateadd(m, -9, getdate()) -- 9 months from right now 

select * 
from tablename t 
    left outer join calendartable r 
    on t.fiscal_month=r.fiscal_month 
where t.date > @date 
+0

表中的數據在每個月的15號上傳,我需要從上個月末抽取顯示9個月的數據。假設今天是06/14/11,並且明天數據將要上傳,他們需要從2010年9月1日至2011年5月31日的數據。希望您現在瞭解我的問題。 – Shahsra 2011-06-14 16:07:25

1

如果您需要刪除數據時,添加新數據,你需要做一個觸發器。觸發器內的sintax就是這樣的。

DELETE t 
FROM 
tablename t 
left outer join calendartable r on 
t.fiscal_month=r.fiscal_month 
where datediff(month, t.date, GETDATE()) > 9 

和SELECT來檢索您的數據將是相似的。

select * from tablename t 
left outer join calendartable r on 
t.fiscal_month=r.fiscal_month 
where datediff(month, t.date, GETDATE()) < 9 
相關問題