Первый день месяца + 1 месяц должен равняться первому следующего месяца. Попытка это на SQL Server
SELECT CAST ('01/01/2012' AS DateTime), DATEADD (m, 1, '01/01/2012')
UNION ALL SELECT CAST ('02/01/2012' AS DateTime), DATEADD (m, 1, '02/01/2012')
UNION ALL SELECT CAST ('03/01/2012' AS DateTime), DATEADD (m, 1, '03/01/2012')
UNION ALL SELECT CAST ('04/01/2012' AS DateTime), DATEADD (m, 1, '04/01/2012')
UNION ALL SELECT CAST ('05/01/2012' AS DateTime), DATEADD (m, 1, '05/01/2012')
В результате
----------------------- -----------------------
2012-01-01 2012-02-01
2012-02-01 2012-03-01
2012-03-01 2012-04-01
2012-04-01 2012-05-01
2012-05-01 2012-06-01
Последний день этого месяца + 1 месяц должен совпадать с последним днем следующего месяца. Это должно произойти в следующем месяце, текущем месяце, 10 месяцах и т. Д.
SELECT CAST ('01/31/2012' AS DateTime), DATEADD (m, 1, '01/31/2012')
UNION ALL SELECT CAST ('01/30/2012' AS DateTime), DATEADD (m, 1, '01/30/2012')
UNION ALL SELECT CAST ('01/29/2012' AS DateTime), DATEADD (m, 1, '01/29/2012')
UNION ALL SELECT CAST ('01/28/2012' AS DateTime), DATEADD (m, 1, '01/28/2012')
UNION ALL SELECT CAST ('01/27/2012' AS DateTime), DATEADD (m, 1, '01/27/2012')
UNION ALL SELECT CAST ('01/26/2012' AS DateTime), DATEADD (m, 1, '01/26/2012')
В результате
----------------------- -----------------------
2012-01-31 2012-02-29
2012-01-30 2012-02-29
2012-01-29 2012-02-29
2012-01-28 2012-02-28
2012-01-27 2012-02-27
2012-01-26 2012-02-26
Посмотрите, как 31, 30, 29 все становятся 29 февраля (2012 год високосный).
p.s. Я снял части времени (все нули), чтобы сделать его более читабельным