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

时间:2008-08-27 14:10:50

标签: sql sql-server database tsql

我正在编写一个查询,其中我必须仅获取去年的数据。这样做的最佳方式是什么?

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

12 个答案:

答案 0 :(得分:181)

以下内容为当前日期增加了1年:

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

答案 1 :(得分:10)

我找到了这个页面,同时寻找一个可以帮助我选择前一个日历年结果的解决方案。上面显示的大多数结果似乎是过去365天的退货项目,这对我来说无效。

与此同时,它确实给了我足够的方向来解决我在以下代码中的需求 - 我在这里发布的任何其他人都有与我相同的需求,并且可能会在搜索溶液

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

感谢上述人士,他们的解决方案帮助我达到了我所需要的目标。

答案 2 :(得分:6)

嗯,我觉得这里缺少一些东西。用户希望从去年而不是过去365天获取数据。存在巨大差异。在我看来,去年的数据是2007年的每一项数据(如果我现在是2008年)。所以正确的答案是:

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

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

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

答案 3 :(得分:4)

在BOL中查找dateadd

dateadd(yy,-1,getdate())

答案 4 :(得分:4)

最具可读性的IMO:

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

其中:

  1. 获取现在的日期时间 GETDATE()=#8/27/2008上午10:23#
  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#
  5. 有DATEDIFF和DATEADD的变种可以让你今天午夜,但它们往往相当迟钝(虽然性能稍好一点 - 与你获取数据所需的读数相比,你并没有注意到。)

答案 5 :(得分: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

答案 6 :(得分:0)

如果您只有“SQL”,那么其他建议也很好。

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

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

答案 7 :(得分:0)

DATEADD函数的参数:

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

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

number 是一个表达式,可以解析为添加到date日期部分的int

date 是一个表达式,可以解析为time,date,smalldatetime,datetime,datetime2或datetimeoffset值。

答案 8 :(得分: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

答案 9 :(得分:0)

我,就像@ D.E。白色,来到这里的原因与原始问题类似但不同。原始问题要求过去365天。 @ samjudson的答案提供了这一点。 @ D.E。怀特的答案会返回前一日历年的结果。

我的查询有点不同,因为它适用于上一年度(包括当前日期):

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

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

答案 10 :(得分:0)

我遇到了类似的问题,但之前的编码器只提供了mm-yyyy格式的日期。我的解决方案很简单但可能对某些人有帮助(我也希望确保开始和结束空格被消除):

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

答案 11 :(得分:0)

由于某种原因,以上结果均对我无济于事。

这将选择最近365天。

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