获取当前和上个月的数据,如果年份和月份是单独的列,

时间:2015-07-20 16:21:53

标签: sql tsql

我试图将当前和上个月的数据导入表格。在导入数据之前,我想删除所有当前月份数据以及上个月的数据。我遇到的问题是年份和月份是单独的列。大多数情况下,在导入新数据之前,我可以使用以下语句删除旧数据:

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语句的想法,但它似乎很复杂,也可能很慢。

谢谢,

2 个答案:

答案 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());