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查询中。
至少对于大表(即几百万行,可能与联接结合)而言,由于优化程序可以更好地工作,因此可以显着提高速度。