我正在编写一个查询,其中我必须仅获取去年的数据。这样做的最佳方式是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
答案 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)))
其中:
有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()