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

时间:2020-03-05 18:43:52  来源:igfitidea点击:

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

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

解决方案

回答

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

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

回答

在BOL中查找dateadd

dateadd(yy,-1,getdate())

回答

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'

回答

最具可读性的IMO:

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

哪个:

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

有DATEDIFF和DATEADD的变体可以让我们今天午夜时分,但它们往往比较笨拙(尽管与读取数据所需的读取相比,其性能稍好一些,但我们不会注意到)。

回答

如果我们具有"仅SQL",则其他建议也很好。

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

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