SQL Server:仅获取过去一年的数据

我写了一个查询,在这个查询中我只需要去年的数据。 做这个的最好方式是什么?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM' 

以下为当前date加1年:

 SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE()) 

我find这个页面,同时寻找一个解决scheme,可以帮助我select上一个日历年的结果。 上面显示的大多数结果似乎是过去365天的退货,这对我来说并不合适。

同时,它给了我足够的方向来解决我的需求在下面的代码 – 我在这里发布的任何其他谁与我的需求相同,并可能遇到此页面寻找解决scheme。

 SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate())) 

感谢上面的解决scheme帮助我达到我所需要的。

那么我觉得这里有些东西是缺less的。 用户想要获取去年的数据,而不是最近的365天。 有一个巨大的差异。 在我看来,去年的数据是2007年的数据(如果现在是2008年的话)。 所以正确的答案是:

 SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1 

那么,如果你想限制这个查询,你可以添加一些其他的filter,但总是在去年search

 SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1 AND DATE > '05/05/2007' 

最可读的IMO:

 SELECT * FROM TABLE WHERE Date > DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101))) 

哪一个:

  1. 获取现在的date时间GETDATE()=#8/27/2008 10:23 am#
  2. 转换为格式为101 CONVERT(varchar,#8/27/2008 10:23 am#,101)='8/27/2007'的string
  3. 转换为date时间CONVERT(datetime,'8/27/2007')=#8/27/2008 12:00 AM#
  4. 减1年DATEADD(yy,-1,#8/27/2008 12:00 AM#)=#8/27/2007 12:00 AM#

有DATEDIFF和DATEADD的变种让你今天午夜,但他们往往是相当钝(虽然稍微好一点的性能 – 不是你会注意到与读取数据所需的读取比较)。

在BOL中查找dateadd

 dateadd(yy,-1,getdate()) 

GETDATE()返回当前date和时间

如果去年去年的当天午夜开始(就像原来的例子),你应该使用类似于:

 DECLARE @start datetime SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one SELECT column1, column2, ..., columnN FROM table WHERE date >= @start 

其他的build议是好的,如果你有“只有SQL”。

不过,我build议, 如果可能的话,在程序中计算date,并将其作为string插入到SQL查询中。

至less对于大表(即数百万行,可能与连接相结合),这将使您的速度有相当大的提高,因为优化器可以更好地工作。

DATEADD函数的参数:

 DATEADD (*datepart* , *number* , *date* ) 

datepart可以是:yy,qq,mm,dy,dd,wk,dw,hh,mi,ss,ms

数字是一个expression式,可以parsing为一个添加到date的date部分的int

date是可以parsing为时间,date,smalldatetime,datetime,datetime2或datetimeoffset值的expression式。

 declare @iMonth int declare @sYear varchar(4) declare @sMonth varchar(2) set @iMonth = 0 while @iMonth > -12 begin set @sYear = year(DATEADD(month,@iMonth,GETDATE())) set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2) select @sYear + @sMonth set @iMonth = @iMonth - 1 end 

我像@DE White一样,来到这里的原因与原来的问题类似但不同。 原来的问题要求过去365天。 @ samjudson的答案提供了。 @DE White的答案返回上一个日历年的结果。

我的查询有点不同,它适用于前一年,直到包括当前date在内:

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

例如,2017年2月17日,此查询将返回2016年1月1日至2017年2月17日的结果

我有一个类似的问题,但以前的编码器只提供了mm-yyyy格式的date。 我的解决scheme很简单,但可能对某些人有帮助(我也想确保开始和结束的空间被消除):

 SELECT ... FROM ....WHERE CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'- ','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE()) 

WHERE date> DATE_SUB(NOW(),INTERVAL 1 YEAR)

这会给你一个查询,每当你运行它将会拉一年的数据。