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

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

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

【问题讨论】:

    标签: sql sql-server database tsql


    【解决方案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)))
        

        其中:

        1. 获取现在的日期时间GETDATE() = #8/27/2008 10:23am#
        2. 转换为格式为 101 的字符串 CONVERT(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
        3. 转换为日期时间CONVERT(datetime, '8/27/2007') = #8/27/2008 12:00AM#
        4. 减去 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())
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-13
                  • 2020-05-30
                  • 1970-01-01
                  相关资源
                  最近更新 更多