SQLServer: 仅获取过去一年的数据

我正在写一个查询,其中我必须得到的数据只有去年。最好的方法是什么?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
397083 次浏览

以下数字与现行日期相比增加了1年:

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

查找日期添加 BOL

dateadd(yy,-1,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

我觉得这里少了点什么。用户希望获得数据从去年,而不是从过去365天。两者有很大的区别。在我看来,去年的数据就是2007年的所有数据(如果我现在是2008年的话)。所以正确的答案应该是:

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

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

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

可读性最强的是:

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

其中:

  1. 获取现在的日期时间 GETDATE () = # 8/27/200810:23 am #
  2. Converts to a string with format 101 CONVERT (varchar,# 8/27/200810:23 am # ,101) = “8/27/2007”
  3. 转换为日期时 CONVERT (datetime,’8/27/2007’) = # 8/27/200812:00 AM #
  4. 减去1年 DATEADD (广州欢聚时代,-1,# 8/27/200812:00 AM #) = # 8/27/200712:00 AM #

DATEDIFF 和 DATEADD 的变体可以让你度过今天的午夜,但是它们往往相当迟钝(尽管性能稍微好一点——与获取数据所需的读取相比,你并不会注意到这一点)。

如果您只使用“ SQL”,那么其他建议也是不错的。

However I suggest, that - 如果可能的话 - you calculate the date in your program and insert it as string in the SQL query.

At least for for big tables (i.e. several million rows, maybe combined with joins) that will give you a considerable speed improvement as the optimizer can work with that much better.

DATEADD 函数的参数:

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

Datepart 可以是: 广州欢聚时代,qq,mm,dy,dd,wk,dw,hh,mi,ss,ms

Number 是一个表达式,可以解析为添加到 date 的 datepart 中的 int

Date 是一个表达式,可以解析为 time、 date、 Small datetime、 datetime、 datetime2或 datetimeoffest 值。

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

我发现这个网页,而寻找一个解决方案,将帮助我选择的结果,从以前的日历年。上面显示的大多数结果似乎是返回过去365天的项目,这对我来说不起作用。

同时,它确实给了我足够的方向来解决我的需求在下面的代码-我在这里张贴的任何其他人谁有同样的需求,因为我可能会遇到这个页面在寻找一个解决方案。

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

感谢上面那些帮助我得到我所需要的解决方案的人。

I, like @D.E. White, came here for similar but different reasons than the original question. The original question asks for the last 365 days. @samjudson's answer provides that. @D.E. White's answer returns results for the prior calendar year.

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

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

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

我有一个类似的问题,但以前的编码器只提供毫米 yyyy 格式的日期。我的解决方案很简单,但可能会对某些人有所帮助(我还想确保开头和结尾的空格都被去掉了) :

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

出于某种原因,以上的结果对我都不起作用。

这选择了过去的365天。

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

这是我的版本。

YEAR(NOW())- 1

例如:

YEAR(c.contractDate) =  YEAR(NOW())- 1

对我来说,这很有效

选择 DATE _ ADD (Now () ,间隔 -2 YEAR) ;