【发布时间】:2010-09-07 00:15:40
【问题描述】:
我正在编写一个查询,我必须在其中获取仅去年的数据。最好的方法是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
【问题讨论】:
标签: sql sql-server database tsql
我正在编写一个查询,我必须在其中获取仅去年的数据。最好的方法是什么?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
【问题讨论】:
标签: sql sql-server database tsql
以下将 -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())
【讨论】:
最易读的,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
【讨论】:
我喜欢@D.E.怀特,出于与原始问题类似但不同的原因来到这里。原始问题询问过去 365 天。 @samjudson 的回答提供了这一点。 @D.E. White 的答案返回上一个日历年的结果。
我的查询有点不同,它适用于上一年到当前日期(包括当前日期):
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
例如,在 2017 年 2 月 17 日,此查询返回 2016 年 1 月 1 日至 2017 年 2 月 17 日的结果
【讨论】:
由于某种原因,上述结果均不适合我。
这会选择过去 365 天。
SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()
【讨论】:
如果您有“仅 SQL”,其他建议很好。
不过我建议 - 如果可能 - 在程序中计算日期并将其作为字符串插入 SQL 查询中。
至少对于大表(即几百万行,可能与联接结合使用)而言,这将为您带来相当大的速度提升,因为优化器可以更好地处理它。
【讨论】:
DATEADD 函数的参数:
DATEADD (*datepart* , *number* , *date* )
日期部分可以是:yy、qq、mm、dy、dd、wk、dw、hh、mi、ss、ms
number 是一个表达式,可以解析为添加到 date 的 datepart 的 int
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
【讨论】:
我遇到了类似的问题,但之前的编码器只提供了 mm-yyyy 格式的日期。我的解决方案很简单,但可能对某些人有帮助(我还想确保消除了开头和结尾的空格):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())
【讨论】: