Цитата:
Сообщение от
Владимир Максимов
Могут быть и другие варианты расчета.
Всё думал, что же еще может быть? Вроде, Владимир уж все возможные разумные варианты перечислил.
А пример оказался под боком - Oracle, как всегда, оригинален. У него есть функция ADD_MONTHS(исходная_дата, количество_месяцев), которая в "спорных" ситуациях конца месяца ведет себя так:
1. (вот она, "оригинальность") Если исходная дата является последним днём месяца, то получившаяся дата тоже будет последним днём месяца.
Например, 29.02.2008 + 1 месяц = 31.03.2008 (но 28.02.2008 + 1 месяц = 28.03.2008)
2. Если исходная дата не имеет соответствующего дня в получившемся месяце, то получившаяся дата становится последним днём месяца
Например, при добавлении одного месяца и к 30.01.2008, и к 31.01.2008 получится одна и та же дата 29.02.2008 (разумеется, 29.01.2008 + 1 месяц тоже будет 29.02.2008).
Для сравнения: функция DateAdd VBA и функция Global::dateMthFwd Аксапты реализуют поведение только по правилу 2 (поэтому разница 31.03.2008 - 29.02.2008 будет равна уже не 1 месяцу, как у Oracle, а 1 месяцу и 2 дням).