115

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

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

12 回答 12

230

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

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
于 2008-08-27T14:12:28.437 回答
13

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

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

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

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

于 2013-04-18T18:34:57.263 回答
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'
于 2008-08-27T14:23:22.203 回答
5

在 BOL 中查找 dateadd

dateadd(yy,-1,getdate())
于 2008-08-27T14:12:53.990 回答
4

最易读的,IMO:

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

哪一个:

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

有 DATEDIFF 和 DATEADD 的变体可以让你在今天的午夜得到你,但它们往往相当迟钝(虽然性能稍微好一些 - 与获取数据所需的读取相比,你不会注意到)。

于 2008-08-27T14:26:07.877 回答
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
于 2008-08-27T14:20:22.163 回答
1

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

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

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

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

于 2017-02-17T18:49:47.183 回答
1

由于某种原因,上述结果都不适合我。

这将选择过去 365 天。

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()
于 2020-01-08T01:52:35.730 回答
0

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

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

至少对于大表(即几百万行,可能与连接结合使用)而言,这会给您带来相当大的速度提升,因为优化器可以更好地处理它。

于 2008-08-27T15:13:39.010 回答
0

DATEADD 函数的参数:

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

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

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

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

于 2011-09-21T14:29:28.473 回答
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
于 2012-05-18T17:58:44.590 回答
0

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

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
于 2017-11-15T17:47:30.683 回答