Home Forums SQL Server 2008 T-SQL (SS2K8) Get the First and Last Day of all the Months based on @ReportDate RE: Get the First and Last Day of all the Months based on @ReportDate

  • sql1411 (10/17/2013)


    Is there a way to get the First and Last Day of all the months (including current) based on the @ReportDate for current year and previous year?

    Yes.

    --===== Create and populate the @ReportDate parameter

    -- which could be used as an input to a function

    -- or stored procedure.

    DECLARE @pReportDate DATETIME;

    SELECT @pReportDate = GETDATE();

    --===== Produce 2 years of monthly start and end dates

    -- to include the current year of @pReportDate

    WITH

    B1(N) AS (SELECT 1 UNION ALL SELECT 1),

    B5(N) AS (SELECT 1 FROM B1 a, B1 b, B1 c, B1 d, B1 e),

    cteTally(N) AS (SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY B5.N) FROM B5)

    SELECT MonthStart = DATEADD(mm,t.N-1,ca.StartDate)

    ,MonthEnd = DATEADD(mm,t.N ,ca.StartDate)-1

    FROM cteTally t

    CROSS APPLY (SELECT DATEADD(yy,DATEDIFF(yy,0,@pReportDate)-1,0)) ca (StartDate)

    ;

    However, to make aggregations easier to include any times in the datetimes of the data for reporting, I'd make the code return the first of the month and the first of the following month.

    --===== Create and populate the @ReportDate parameter

    -- which could be used as an input to a function

    -- or stored procedure.

    DECLARE @pReportDate DATETIME;

    SELECT @pReportDate = GETDATE();

    --===== Produce 2 years of monthly start and next month start dates

    -- to include the current year of @pReportDate

    WITH

    B1(N) AS (SELECT 1 UNION ALL SELECT 1),

    B5(N) AS (SELECT 1 FROM B1 a, B1 b, B1 c, B1 d, B1 e),

    cteTally(N) AS (SELECT TOP 24 ROW_NUMBER() OVER (ORDER BY B5.N) FROM B5)

    SELECT MonthStart = DATEADD(mm,t.N-1,ca.StartDate)

    ,NextMonthStart = DATEADD(mm,t.N ,ca.StartDate)

    FROM cteTally t

    CROSS APPLY (SELECT DATEADD(yy,DATEDIFF(yy,0,@pReportDate)-1,0)) ca (StartDate)

    ;

    --Jeff Moden


    RBAR is pronounced "ree-bar" and is a "Modenism" for Row-By-Agonizing-Row.
    First step towards the paradigm shift of writing Set Based code:
    ________Stop thinking about what you want to do to a ROW... think, instead, of what you want to do to a COLUMN.

    Change is inevitable... Change for the better is not.


    Helpful Links:
    How to post code problems
    How to Post Performance Problems
    Create a Tally Function (fnTally)