• For a SQL based solution, you can try this, but please note that it won't work for billing dates that start on the 29th, 30th, or 31st of the month.

    declare @BillDate datetime;

    declare @StartDay int;

    set @StartDay = 21; -- Beginning day of billing cycle, this code will not work properly for billing dates starting 29 - 31

    set @BillDate = cast('20120401' as datetime); -- Test date

    select @BillDate;

    with e2 (

    N

    ) as (

    select 1 union all select 1

    )

    ,e10 (

    N

    ) as (

    select 1 union all select 1 union all select 1 union all select 1 union all select 1

    union all select 1 union all select 1 union all select 1 union all select 1 union all select 1

    )

    ,e20 (

    N

    ) as (

    select row_number() over (order by (select null)) from e2 a cross join e10 b

    )

    --select N from e20;

    select

    convert(varchar(10),dateadd(dd, @StartDay - 1, dateadd(mm, datediff(mm, 0, dateadd(dd, -N * @StartDay,@BillDate)), 0)),101) + ' - ' +

    convert(varchar(10),dateadd(dd, -1, dateadd(mm, 1, dateadd(dd, @StartDay - 1, dateadd(mm, datediff(mm, 0, dateadd(dd, -N * @StartDay,@BillDate)), 0)))),101)

    from e20