繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM