我正在写一个查询,其中我只需要获取去年的数据。做这个的最好方式是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
我正在写一个查询,其中我只需要获取去年的数据。做这个的最好方式是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Answers:
以下内容将-1年添加到当前日期:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
好吧,我认为这里缺少什么。用户希望获取过去一年而不是过去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)))
哪一个:
有DATEDIFF和DATEADD的变体可以让您今天午夜时分,但它们往往比较钝(尽管性能稍好-与获取数据所需的读取相比,您不会注意到)。
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
如果您具有“仅SQL”,则其他建议也很好。
但是我建议,如果可能的话,您可以在程序中计算日期并将其作为字符串插入SQL查询中。
至少对于大表(即几百万行,可能与联接结合)而言,由于优化程序可以更好地工作,因此可以大大提高速度。
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
我有一个类似的问题,但是以前的编码器仅以mm-yyyy格式提供了日期。我的解决方案很简单,但可能对某些人有用(我还想确保消除了开始和结束空格):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())