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


Answers:


196

以下内容将-1年添加到当前日期:

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

1
您的机器更干净,但是我的状况是:YEAR(GETDATE())-1
PCPGMR 2015年

2
这将返回一个数字,而不是日期,然后您就无法将其与日期进行比较,而无需计算该日期的年份。然后,这将返回2014年12月31日与2015年1月1日的不正确结果-这是不同的年份,但相差不了一年...
samjudson

正确。我需要按年份比较年份,因此,例如2013年至2014年,因为输入的数据只有年份。我的评论不清楚。谢谢
PCPGMR 2015年

我在运行此查询时收到错误消息...“ FUNCTION DatabaseName.DATEADD不存在”有任何建议吗?
Marcello Perri

10

我在寻找解决方案时找到了该页面,该解决方案可以帮助我选择上一个日历年的结果。上面显示的大多数结果似乎都是过去365天的退货,这对我不起作用。

同时,它的确给了我足够的方向来解决以下代码中的需求-我将其发布在此处,供与我有相同需求并且可能在此页面中寻找解决方案的其他任何人使用。

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

感谢上述人员的解决方案帮助我实现了所需。


7

好吧,我认为这里缺少什么。用户希望获取过去一年而不是过去365天的数据。有很大的不同。我认为,去年的数据是2007年的所有数据(如果我现在是2008年)。因此正确的答案是:

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

然后,如果您想限制此查询,则可以添加其他过滤器,但始终在去年进行搜索。

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

这在大表上将具有非常差的性能,您的查询将遍历每条记录以评估日期的年份值,最好使用日期范围
Adriaan Davel 2012年


4

最具可读性的IMO:

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

哪一个:

  1. 获取现在的日期时间GETDATE()=#8/27/2008 10:23 am#
  2. 转换为格式为101 CONVERT(varchar,#8/27/2008 10:23 am#,101)='8/27/2007'的字符串
  3. 转换为日期时间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的变体可以让您今天午夜时分,但它们往往比较钝(尽管性能稍好-与获取数据所需的读取相比,您不会注意到)。


2

GETDATE()返回当前日期和时间

如果去年去年当天的午夜开始(如原始示例中所示),则应使用以下方法:

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

0

如果您具有“仅SQL”,则其他建议也很好。

但是我建议,如果可能的话,您可以在程序中计算日期并将其作为字符串插入SQL查询中。

至少对于大表(即几百万行,可能与联接结合)而言,由于优化程序可以更好地工作,因此可以大大提高速度。


2
如果创建一个参数化的字符串并避免将值放在字符串本身中,那就更好了……
Adriaan Davel 2012年

0

DATEADD函数的参数:

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

日期部分可以是:yy,qq,mm,dy,dd,wk,dw,hh,mi,ss,ms

是可以解析为int的表达式,该int被添加到datedate

date是可以解析为时间,日期,smalldatetime,datetime,datetime2或datetimeoffset值的表达式。


0
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

1
这没有解决问题。
内森·斯克尔

此外,while循环一般是不好的SQL
StingyJack

0

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

我的查询有点不同,它适用于直到并包括当前日期的上一年:

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

例如,在2017年2月17日,此查询将结果从1/1/2016返回到2/17/2017


0

我有一个类似的问题,但是以前的编码器仅以mm-yyyy格式提供了日期。我的解决方案很简单,但可能对某些人有用(我还想确保消除了开始和结束空格):

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

0

出于某种原因,以上结果均不适用于我。

这将选择过去365天。

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

如果您可以添加适用于此功能的MSSQL服务器版本,那将是很好的。
itwasntme
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.