【问题标题】:SQL previous 12 months functionSQL 前 12 个月函数
【发布时间】:2013-12-18 08:46:56
【问题描述】:

这次我需要一个函数来选择前 12 个月。 如果选择 2013 年 12 月,它应该返回 2013 年 11 月到 2012 年 11 月的数据。 结果应该显示:

 - Year   -      Month
 - 2013   -       11
 - 2013   -       10
 - 2013   -       09

我之前的问题得到了回答,但我真的不知道如何编辑日期部分来选择月份:

    ALTER function [dbo].[LastMonths]
    (
        @Date datetime
    )   RETURNS @tbl TABLE (Start datetime, EndDate datetime)
    AS   
    BEGIN
        WITH T AS(
        SELECT 
            DATEADD(month, DATEDIFF(month, 0, @Date), 0) AS Start,
            DATEADD(d, -DAY(DATEADD(m,1,@date)),DATEADD(m,1,@date)) AS EndDate,
            12 Cnt
        UNION ALL
        SELECT 
            DATEADD(month, -1, Start),
            DATEADD(d, -DAY(DATEADD(m,1,Start-1)),DATEADD(m,1,Start-1)),
            Cnt-1
        FROM
            T
        WHERE
            Cnt-1>0
        )
        INSERT INTO @tbl 
            (Start, EndDate)
        SELECT 
            Start, EndDate
        FROM T

RETURN
    END

感谢所有热心帮助的人!

【问题讨论】:

    标签: sql-server sql-server-2008 tsql datetime ssms


    【解决方案1】:

    我将查询稍微修改为以下内容:

    declare @date date = '01 december 2013'
    
    ;WITH T AS(
    SELECT 
        DATEADD(month, -1, @date) AS Start,
        12 Cnt
        UNION ALL
    SELECT 
         DATEADD(month, -1, Start),
         Cnt-1
    FROM T
    WHERE Cnt-1>=0
    )
    SELECT  YEAR(start) [year], MONTH(Start) [month]
    FROM    t
    

    产生了以下结果:

    year    month
    2013    11
    2013    10
    2013    9
    2013    8
    2013    7
    2013    6
    2013    5
    2013    4
    2013    3
    2013    2
    2013    1
    2012    12
    2012    11
    

    这似乎产生了您想要的结果,但如果不是这种情况,请随时发表评论。

    【讨论】:

    • 结束了。但我需要一个列中的年份和另一个列中的日期 2013 - 12 2013 - 11 2013 - 10
    • 只做你结果的一个日期部分,例如 select datepart(year, start), start, cnt from t
    • 奇怪,我只得到包含在函数中的 Select 语句不能将数据返回给客户端。
    • 那么查询不是实际的功能。只需将我所做的事情放在您的功能中即可。我只是想展示结果,但@t-clausen.dk 给出了更完整的解决方案。
    【解决方案2】:

    试试这个:

    create function [dbo].[LastMonths]
        (
            @Date datetime
        )   RETURNS @tbl TABLE (year int, month int)
        AS   
        BEGIN
            WITH T AS(
            SELECT 
                dateadd(m, -1, @date) d
            UNION ALL
            SELECT 
                dateadd(m, -1, d) d
            FROM
                T
            WHERE
                d > dateadd(m, -13, @date)
            )
            INSERT INTO @tbl 
            SELECT 
                year(d), month(d)
            FROM T
    
    RETURN
    END
    

    测试:

    select * from [LastMonths](getdate())
    

    结果:

    year    month
    2013    11
    2013    10
    2013    9
    2013    8
    2013    7
    2013    6
    2013    5
    2013    4
    2013    3
    2013    2
    2013    1
    2012    12
    2012    11
    

    【讨论】:

      【解决方案3】:
      CREATE FUNCTION [dbo].[PrevMonths] ( 
          @date datetime
      )
      RETURNS TABLE
      RETURN (
          SELECT
            YEAR( DATEADD(month,delta,@date)) AS [Year],
            MONTH(DATEADD(month,delta,@date)) AS [Month]
          FROM (VALUES (-1),(-2),(-3),(-4),(-5),(-6),(-7),(-8),(-9),(-10),(-11),(-12)) T(delta)
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-02
        • 2013-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-12
        相关资源
        最近更新 更多