SQL前12个月的功能

时间:2013-12-18 08:46:57

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

这次我需要一个功能,只需选择前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

感谢所有善意帮助的人!

3 个答案:

答案 0 :(得分: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

这似乎产生了你想要的结果,但如果不是这样,那么随意发表评论。

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:0)

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)
)
相关问题