Показать сообщение отдельно
Старый 11.01.2009, 10:53   #22  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
На заметку для общего развития
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Могут быть и другие варианты расчета.
Всё думал, что же еще может быть? Вроде, Владимир уж все возможные разумные варианты перечислил.

А пример оказался под боком - 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 дням).
За это сообщение автора поблагодарили: ivas (2).