Sql 如何编写在给定日期提取每年数据的查询

Sql 如何编写在给定日期提取每年数据的查询,sql,sql-server,ssms,Sql,Sql Server,Ssms,我有一个查询,其中我需要提取给定日期的索赔数据,并返回该日期之前每年的数据,例如 我今天提出索赔:2019年1月15日 我希望能够在一个通用查询中提取所有其他年份,因为这将是一个存储过程 这将使我能够查看过去几年中,在给定的日期是否有索赔 如果我要创建一个变量或案例陈述,我可以分别完成1年、2年、3年的工作,但有没有一种方法可以以更简单的方式完成 以下是1年前的代码: SELECT * FROM tblClaim c WHERE c.IncidentDate = DATEadd(year, -1

我有一个查询,其中我需要提取给定日期的索赔数据,并返回该日期之前每年的数据,例如

我今天提出索赔:2019年1月15日

我希望能够在一个通用查询中提取所有其他年份,因为这将是一个存储过程

这将使我能够查看过去几年中,在给定的日期是否有索赔

如果我要创建一个变量或案例陈述,我可以分别完成1年、2年、3年的工作,但有没有一种方法可以以更简单的方式完成

以下是1年前的代码:

SELECT * FROM tblClaim c
WHERE c.IncidentDate = DATEadd(year, -1, CAST(FLOOR( CAST(GETDATE() AS FLOAT)) AS DATETIME)) AND c.StatusID = 2

嗯?仅使用日期部分应该更容易:

SELECT c.* 
FROM tblClaim c
WHERE c.StatusID = 2 AND
      DAY(c.IncidentDate) = DAY(GETDATE()) AND
      MONTH(c.IncidentDate) = MONTH(GETDATE());
注二:

  • 2月29日当心
  • 这将不使用索引

如果您想将闰年作为存储过程来处理,那么这就是我必须处理的。也许有更简单的方法,但我想不出一个。如果您计划使用SSRS,也可以将我的输入参数更改为灵活的日期

我创建了一个模拟表:

CREATE TABLE #tblClaim (statusid INT, incidentdate DATE)
INSERT INTO #tblClaim (statusid, incidentdate)
VALUES (1,'2019-01-15'),(2,'2019-01-15'),(1,'2018-01-15'),(2,'2018-01-15'),
       (1,'2017-01-15'),(2,'2016-01-15'),(1,'2012-02-29'),(2,'2012-02-29'),
       (1,'2016-02-29'),(2,'2016-02-29'),(1,'2008-02-29'),(2,'2008-02-29'),
       (1,'2012-02-28'),(2,'2012-02-28'),(1,'2016-03-01'),(2,'2016-03-01'),
       (1,'2008-03-01'),(2,'2008-02-28');
然后我创建了一个proc(相应地调整需要显示的变量):

CREATE PROC dbo.myproc as
声明@leapyear INT=229
声明@date=GETDATE()

--DECLARE@date date='20160229'此查询将提供3年的数据

select [date] from TableName where (year([date]) = year(getdate())-1
or year([date]) = year(getdate())-2
or year([date]) = year(getdate())-3)

好吧,但是我怎么做闰年呢,因为我不能排除that@TylerStevens . . . 再问一个问题,明确闰年该做什么。修改这个问题似乎会显著改变它:“我需要提取给定日期的索赔数据,并返回该日期之前每年的数据”。这回答了您提出的问题。感谢您的帮助和解释
select [date] from TableName where (year([date]) = year(getdate())-1
or year([date]) = year(getdate())-2
or year([date]) = year(getdate())-3)