Годы Месяцы Дни

ЮрИван
Дата: 19.11.2006 12:44:11
Уважаемые господа!

Вот задачка: посчитать N временных интервалов в Годах, Месяцах, Днях между событиями
и сложить все эти интервалы, вернув ответ тоже в Годах, Месяцах, Днях.

Access прекрасно считает Дни между событиями. Однако при переводе оных в Годы, Месяцы, Дни
возникает ряд сложностей. Надо организовать учет високосных и невисокосных годов, надо научить
машину понимать, что ЦЕЛЫЙ МЕСЯЦ это м.б. и 28, и 29, и 30, и 31 день. Полученные т.о. временные
интервалы (в Г, М, Д) между событиями, надо еще и сложить. Тут тоже своя логика: положим при
суммировании получилось 397 Дней, 59 Месяцев и 33 Года. Как перевести это в человеческий вид?
Ведь в зависимости от конкретных интервалов в сумме это может дать разное число этих самых
пресловутых Г, М, Д, верно?

У меня 19 ноября долгое время был большой праздник - я 25 лет служил в РВСН - это был самый
мощный вид Вооруженных Сил тогдашней страны. Сегодня он празднуется в другой день. Но в душе и на
генетическом уровне я всегда отмечаю его сегодня - в этот день, в 1942г., артподготовка под Сталинградом
привела к коренному перелому хода II мировой войны, после чего только там было уничтожено свыше
миллиона фашистов. Оставшиеся в живых солдаты Вермахта более всего восхищаются и сегодня
Подвигом защитников Брестской Крепости и тем, как им дали п... под Сталинградом.

Если кто-то сделает мне маленький подарок в этой связи - буду крайне благодарен, как и всем тем, кто уже несколько

раз выручал меня. Говорю всем вам СПАСИБО, что в старорусском означает "спаси Бог тебя"!

С искренним уважением, Юрии Кузнецов.
Владимир Саныч
Дата: 19.11.2006 13:03:12
ЮрИван
Как перевести это в человеческий вид?
Ведь в зависимости от конкретных интервалов в сумме это может дать разное число этих самых
пресловутых Г, М, Д, верно?

Совершенно верно. Поэтому прежде, чем программировать на Аксессе, надо сначала определиться с постановкой задачи, т.е. волевым путем принять, что месяцы будут считаться так, а не иначе.
ЮрИван
Дата: 19.11.2006 13:17:33
Хорошо, будем считать, как некоторые службы, что занимаются подсчетом пенсий: каждый месяц это ровно 30 дней. Но это уже только при суммировании интервалов.

Рад видеть тебя, Владимир Саныч! Хотел приехать, да не вышло.

С уважением, Ю.К.
Владимир Саныч
Дата: 19.11.2006 13:34:47
ЮрИван
Хорошо, будем считать, как некоторые службы, что занимаются подсчетом пенсий: каждый месяц это ровно 30 дней. Но это уже только при суммировании интервалов.

Наверно, надо хранить интервалы _точно_, т.е. в днях. То есть суммировать именно дни, и только потом переводить в месяцы и т.д. А если надо какой-то интервал показать в месяцах, то переводить его отдельно, только для показа.

ЮрИван
Рад видеть тебя, Владимир Саныч!

Взаимно!
бабай
Дата: 19.11.2006 15:44:40
акцесс прекрасно считает не только дни, а что поросишь, то и считает.
поразглядывайте этот код

Sub testDateInterval()
    Dim tDate1 As Date, tDate2 As Date, lngYears&, lngMonths&, lngDays&
    tDate1 = DateSerial(2006, 11, 19)
    tDate2 = DateSerial(2008, 1, 22)
    
    DateToYeaRMonthDay tDate1, tDate2, lngYears&, lngMonths&, lngDays&
    'длина интервала
    Debug.Print lngYears&, lngMonths&, lngDays&
    'дата, отстоящая от текущей на указанный интервал
    Debug.Print DateSerial(Year(tDate1) + lngYears, Month(Date) + lngMonths, Day(Date) + lngDays)
End Sub

Sub DateToYeaRMonthDay(ByVal startDate As Date, ByVal stopDate As Date, _
ByRef lYears As Long, lMonths As Long, lDays As Long)
    startDate = DateValue(startDate): stopDate = DateValue(stopDate)
    Dim tmpDate As Date
    ' к-во лет
    lYears = DateDiff("yyyy", startDate, stopDate)
    If DateAdd("yyyy", lYears, startDate) > stopDate Then lYears = lYears - 1
    'к-во месяцев
    tmpDate = DateAdd("yyyy", lYears, startDate)
    lMonths = DateDiff("m", tmpDate, stopDate)
    If DateAdd("m", lMonths, tmpDate) > stopDate Then lMonths = lMonths - 1
    'к-во дней
    lDays = DateDiff("d", DateAdd("m", lMonths, tmpDate), stopDate)
    
End Sub
бабай
Дата: 19.11.2006 16:29:19
вместо
Debug.Print DateSerial(Year(tDate1) + lngYears, Month(Date) + lngMonths, Day(Date) + lngDays)

должно быть
Debug.Print DateSerial(Year(tDate1) + lngYears, Month(tDate1) + lngMonths, Day(tDate1) + lngDays)
ЮрИван
Дата: 19.11.2006 20:55:40
Бабаю - спасибо предварительное огромное попробу. завтра. Пока не могу. С головой неважно.
Владимиру Санычу - письмо написал на sanych@sgl.ru. Прочел?
Всего Вам самого самого доброго, уважаемые господа!
Владимир Саныч
Дата: 19.11.2006 21:30:29
ЮрИван
Владимиру Санычу - письмо написал на sanych@sgl.ru. Прочел?

Не-а. Адрес неправильный. SQL, а не SGL.