![](/img/trans.png)
[英]Oracle SQL: Get the last eight months of data (with YEAR and MONTH columns)
[英]Get current and last month data if year and month are separate columns,
我正在嘗試將當前和上個月的數據導入表中。 在導入數據之前,我要刪除所有當前月份數據以及上個月數據。 我遇到的問題是,年份和月份是單獨的列。 在大多數情況下,在導入新數據之前,我可以使用以下語句刪除舊數據:
DELETE FROM MyTable
WHERE YearColumn = YEAR(GETDATE()) AND MonthColumn >= MONTH(DATEADD(MM, - 1, (GETDATE())))
但是,此聲明的問題是一月份來臨時會發生什么。 說,在明年一月,此語句將刪除YearColumn = 2016和MonthColumn> = 12的所有記錄,而我想刪除YearColumn = 2015和MonthColumn> = 12以及YearColumn = 2016和MonthColumn的所有記錄> = 1。
最好的方法是什么? 我對where子句中的case語句有一些想法,但似乎會很復雜,並且可能也會很慢。
謝謝,
您可以對年份應用與對月份相同的邏輯:
DELETE FROM MyTable
WHERE YearColumn = YEAR(DATEADD(month, - 1, GETDATE())) AND
MonthColumn >= MONTH(DATEADD(month, - 1, GETDATE()))
注意:我更喜歡拼寫日期部件名稱,而不是使用縮寫。 這樣,對於MM
是幾個月還是幾分鍾,沒有人需要三思。
一個case
表達式也可以。 我懷疑你有很多煩惱。
DELETE FROM MyTable
WHERE
YearColumn = YEAR(DATEADD(month, -1, GETDATE()))
AND MonthColumn = MONTH(DATEADD(month, -1, GETDATE()))
OR YearColumn = YEAR(GETDATE())
AND MonthColumn = MONTH(GETDATE());
如果確實存在性能問題,則可以嘗試添加額外的可調節條件:
DELETE FROM MyTable
WHERE
(
YearColumn = YEAR(DATEADD(month, -1, GETDATE()))
AND MonthColumn = MONTH(DATEADD(month, -1, GETDATE()))
OR YearColumn = YEAR(GETDATE())
AND MonthColumn = MONTH(GETDATE())
)
/* this might help with performance issues */
AND YearColumn >= YEAR(DATEADD(month, -1, GETDATE());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.