选择年份(getdate() - 2),将月份选为12

时间:2014-08-06 10:01:42

标签: sql sql-server

我的源表列是ReportingPeriod Nvarchar(6) 删除查询必须在2年之前用于数据。

此查询不起作用

delete from table where ReportingPeriod  < year(getdate() -2) and month as 12

我需要将201212作为结果

标准是当前年-2,月是12

2014年预期结果为201212 2015年预期结果为201312

3 个答案:

答案 0 :(得分:1)

我会首先将所有日期数学保存为datetime,然后在结尾处转换为nvarchar。如果没有提供足够的空间,CONVERT会简单地截断结果,因此我们只提供年和月的空间,我们得到了我们想要的东西:

select CONVERT(nvarchar(6),
      DATEADD(year,DATEDIFF(year,'20010101',CURRENT_TIMESTAMP)
                                ,'19991201')
   ,112)

结果:

201212

这是有效的,因为我们利用了两个任意日期之间的关系 - 例如,对于2001年的任何日期,我们想要的结果将是1999年12月的日期 - 这就是我所使用的日期。


对于这个要求,上述情况可能看起来过于复杂,但是有可能使DATEADD / DATEDIFF模式中的许多问题适当选择使用期限和两个任意日期和它们之间的关系。

答案 1 :(得分:0)

您可以尝试类似

的内容
SELECT FROM <YOUR_TABLE>
WHERE ReportingPeriod < Convert(nvarchar(4), year(getdate()) - 2) + '12'

答案 2 :(得分:0)

您可以将ReportingPeriod投放到某个日期,因此201212会变为2012-12-01,因为我认为您不关心该月的某一天。

cast(left(ReportingPeriod,4) + '-' 
    + RIGHT(ReportingPeriod, 2) + '-01' as datetime)

然后从GETDATE()获取当前年份-2并追加月份12和日31来比较这些值,这将返回2012-12-31

cast(cast(
     cast(year(getdate()) -2 as nvarchar(4))
     + '-12-31' as nvarchar(10)) as datetime)

因此,根据设置为12的月份,您应该能够选择所有超过2年的记录。

select cast(left(ReportingPeriod,4) + '-' 
       + RIGHT(ReportingPeriod, 2) + '-01' as datetime) ReportPeriodDate
from [YourTable]
where cast(left(ReportingPeriod,4) + '-' 
      + RIGHT(ReportingPeriod, 2) + '-01' as datetime) 
      <= cast(cast(
              cast(year(getdate()) -2 as nvarchar(4)) 
+ '-12-31' as nvarchar(10)) as datetime)

然后你只需要用这个逻辑删除。

delete [YourTable]
where cast(left(ReportingPeriod,4) + '-' 
      + RIGHT(ReportingPeriod, 2) + '-01' as datetime) 
      <= cast(cast(
              cast(year(getdate()) -2 as nvarchar(4)) 
              + '-12-31' as nvarchar(10)) as datetime)

Demo SQL Fiddle