SQL服务器:仅获取过去一年的数据
-
09-06-2019 - |
题
我正在编写一个查询,其中我必须仅获取去年的数据。做这个的最好方式是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
解决方案
以下内容在当前日期的基础上添加 -1 年:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
其他提示
我在寻找可以帮助我选择上一日历年结果的解决方案时发现了此页面。上面显示的大多数结果似乎都是过去 365 天的退货项目,这对我来说不起作用。
同时,它确实给了我足够的指导来解决我在以下代码中的需求 - 我将其发布在这里,供任何与我有相同需求以及在寻找解决方案时可能遇到此页面的其他人使用。
SELECT .... FROM .... WHERE year(*your date column*) = year(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'
在 BOL 中查找 dateadd
dateadd(yy,-1,getdate())
最易读的,国际海事组织:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
哪个:
- 获取现在的日期时间 GETDATE() = #8/27/2008 10:23am#
- 转换为格式为 101 的字符串 CONVERT(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
- 转换为日期时间 CONVERT(日期时间, '8/27/2007') = #8/27/2008 12:00AM#
- 减去1年 DATEADD(yy, -1, #8/27/2008 12:00AM#) = #8/27/2007 12:00AM#
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 查询中。
至少对于大桌子来说(即数百万行(可能与联接结合使用),这将为您带来相当大的速度提升,因为优化器可以更好地处理它。
DATEADD 函数的参数:
DATEADD (*datepart* , *number* , *date* )
日期部分 可:yy、qq、mm、dy、dd、wk、dw、hh、mi、ss、ms
数字 是一个可以解析为添加到日期的日期部分的 int 的表达式
日期 是一个可以解析为 time、date、smalldatetime、datetime、datetime2 或 datetimeoffset 值的表达式。
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
我,就像@D.E.怀特,来到这里的原因与最初的问题相似但不同。最初的问题询问过去 365 天。@samjudson 的回答提供了这一点。@D.E.怀特的答案返回上一日历年的结果。
我的查询有点不同,因为它适用于 上一年截至当前日期(包括当前日期):
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
例如,2017 年 2 月 17 日,此查询返回从 1/1/2016 到 2/17/2017 的结果
我遇到了类似的问题,但以前的编码器只提供了 mm-yyyy 格式的日期。我的解决方案很简单,但可能对某些人有帮助(我还想确保消除开始和结束空格):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())