SQL Server:仅获取过去一年的数据

Posted

技术标签:

【中文标题】SQL Server:仅获取过去一年的数据【英文标题】:SQL Server: Get data for only the past year 【发布时间】:2010-09-07 00:15:40 【问题描述】:

我正在编写一个查询,我必须在其中获取仅去年的数据。最好的方法是什么?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

【问题讨论】:

【参考方案1】:

以下将 -1 年添加到当前日期:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

【讨论】:

你的更干净,但这是我的:YEAR(GETDATE()) - 1 这将返回一个数字,而不是日期,然后您无法将其与日期进行比较,而无需计算该日期的年份。然后,这将返回 2014 年 12 月 31 日与 2015 年 1 月 1 日的错误结果——它们在不同的年份,但不相隔一年...... 正确。我需要逐年比较年份,例如 2013 到 2014 年,因为传入的数据只有年份。我的评论并不清楚。谢谢 运行此查询时收到一条错误消息...“FUNCTION DatabaseName.DATEADD 不存在”有什么建议吗? 日期格式为时间戳如何获取【参考方案2】:

我在寻找可以帮助我选择上一日历年结果的解决方案时发现了此页面。上面显示的大多数结果似乎是过去 365 天的退货商品,这对我不起作用。

同时,它确实为我提供了足够的方向来解决我在以下代码中的需求 - 我在此处发布这些代码,以供与我有相同需求并且可能会在搜索此页面时遇到的任何其他人解决方案。

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))

感谢上面的人,他们的解决方案帮助我找到了我需要的东西。

【讨论】:

【参考方案3】:

嗯,我认为这里缺少一些东西。用户想要获取去年的数据,而不是过去 365 天的数据。有很大的不同。在我看来,去年的数据是 2007 年的所有数据(如果我现在是 2008 年)。所以正确的答案是:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1

然后如果你想限制这个查询,你可以添加一些其他的过滤器,但总是在去年搜索。

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'

【讨论】:

这在大表上性能很差,你查询会遍历每条记录来评估日期的年份值,最好使用日期范围 @Adriaan Davel。你会怎么用 daterange 写呢?【参考方案4】:

在 BOL 中查找 dateadd

dateadd(yy,-1,getdate())

【讨论】:

【参考方案5】:

最易读的,IMO:

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(datetime, '8/27/2007') = #8/27/2008 12:00AM# 减去 1 年 DATEADD(yy, -1, #8/27/2008 12:00AM#) = #8/27/2007 12:00AM#

DATEDIFF 和 DATEADD 的变体可以让您在今天的午夜获得帮助,但它们往往相当迟钝(尽管性能稍好 - 与获取数据所需的读取相比,您不会注意到)。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我喜欢@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 日的结果

【讨论】:

【参考方案8】:

由于某种原因,上述结果均不适合我。

这会选择过去 365 天。

 SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()

【讨论】:

如果您可以添加适用于它的 MSSQL 服务器版本会很好。【参考方案9】:

如果您有“仅 SQL”,其他建议很好。

不过我建议 - 如果可能 - 在程序中计算日期并将其作为字符串插入 SQL 查询中。

至少对于大表(即几百万行,可能与联接结合使用)而言,这将为您带来相当大的速度提升,因为优化器可以更好地处理它。

【讨论】:

如果您创建一个参数化字符串并避免将值放在字符串本身中会更好......【参考方案10】:

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 值。

【讨论】:

【参考方案11】:
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

【讨论】:

这并没有解决问题。 另外,while 循环通常对 SQL 不利【参考方案12】:

我遇到了类似的问题,但之前的编码器只提供了 mm-yyyy 格式的日期。我的解决方案很简单,但可能对某些人有帮助(我还想确保消除了开头和结尾的空格):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())

【讨论】:

以上是关于SQL Server:仅获取过去一年的数据的主要内容,如果未能解决你的问题,请参考以下文章

sql 怎么查询每一年1到12个月的数据

java获取过去一天,过去一月,过去一年的日期,以及截至今天过去某一段时间的时间集

需要帮助从 R 中的 .nc 数据集中提取仅一年的数据

如何项sql数据库中添加一年的日期

sql查询一年里1到4月的数据

SQL Server - 同步两个数据库