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