我试图将当前和上个月的数据导入表格。在导入数据之前,我想删除所有当前月份数据以及上个月的数据。我遇到的问题是年份和月份是单独的列。大多数情况下,在导入新数据之前,我可以使用以下语句删除旧数据:
DELETE FROM MyTable
WHERE YearColumn = YEAR(GETDATE()) AND MonthColumn >= MONTH(DATEADD(MM, - 1, (GETDATE())))
但是,这个陈述的问题是在1月份出现时会发生什么。比如,在明年1月,此声明将删除YearColumn = 2016和MonthColumn> = 12的所有记录,而我想要删除YearColumn = 2015 和MonthColumn&gt的所有记录; = 12以及YearColumn = 2016 和MonthColumn> = 1.
最好的方法是什么? 我在where子句中有一些case语句的想法,但它似乎很复杂,也可能很慢。
谢谢,
答案 0 :(得分:1)
您可以将相同的逻辑应用于您应用于月份的年份:
DELETE FROM MyTable
WHERE YearColumn = YEAR(DATEADD(month, - 1, GETDATE())) AND
MonthColumn >= MONTH(DATEADD(month, - 1, GETDATE()))
作为注释:我更喜欢拼写日期部分名称而不是缩写。这样,没有人必须三思而后行MM
是指几个月或几分钟。
答案 1 :(得分:0)
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());
如果性能确实存在问题,您可以尝试添加额外的sargable条件:
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());