После добавления месяца сравните ДЕНЬ.Если меньше, потому что вместо этого DATEADD подходит к концу месяца (например, с 31 января по 28 февраля), тогда переходите к следующему месяцу
Здесь DATEADD / DATEDIFF пропускается к началу следующего месяца
declare @StartEffectiveDate datetime
set @StartEffectiveDate = '2011-01-20'
SELECT
CASE
WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
END
set @StartEffectiveDate = '2011-01-31'
SELECT
CASE
WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
END
set @StartEffectiveDate = '2011-02-28'
SELECT
CASE
WHEN DAY(@StartEffectiveDate) <= DAY(DATEADD (MONTH, 1, @StartEffectiveDate)) THEN DATEADD (MONTH, 1, @StartEffectiveDate)
ELSE DATEADD(day, 1, DATEADD (MONTH, 1, @StartEffectiveDate))
END
Редактировать: нужно добавить только дополнительный день, а не какой-нибудь необычный DATEADD / DATEDIFF ...