Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Годы Месяцы Дни  [new]
ЮрИван
Member

Откуда: Брест. Не Франция. Тот, где Брестская крепость.
Сообщений: 41
Уважаемые господа!

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

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

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

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

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

С искренним уважением, Юрии Кузнецов.
19 ноя 06, 12:44    [3420690]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
ЮрИван
Как перевести это в человеческий вид?
Ведь в зависимости от конкретных интервалов в сумме это может дать разное число этих самых
пресловутых Г, М, Д, верно?

Совершенно верно. Поэтому прежде, чем программировать на Аксессе, надо сначала определиться с постановкой задачи, т.е. волевым путем принять, что месяцы будут считаться так, а не иначе.
19 ноя 06, 13:03    [3420707]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
ЮрИван
Member

Откуда: Брест. Не Франция. Тот, где Брестская крепость.
Сообщений: 41
Хорошо, будем считать, как некоторые службы, что занимаются подсчетом пенсий: каждый месяц это ровно 30 дней. Но это уже только при суммировании интервалов.

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

С уважением, Ю.К.
19 ноя 06, 13:17    [3420715]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
ЮрИван
Хорошо, будем считать, как некоторые службы, что занимаются подсчетом пенсий: каждый месяц это ровно 30 дней. Но это уже только при суммировании интервалов.

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

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

Взаимно!
19 ноя 06, 13:34    [3420728]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
бабай
Guest
акцесс прекрасно считает не только дни, а что поросишь, то и считает.
поразглядывайте этот код

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 ноя 06, 15:44    [3420958]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
бабай
Guest
вместо
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 ноя 06, 16:29    [3421027]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
ЮрИван
Member

Откуда: Брест. Не Франция. Тот, где Брестская крепость.
Сообщений: 41
Бабаю - спасибо предварительное огромное попробу. завтра. Пока не могу. С головой неважно.
Владимиру Санычу - письмо написал на sanych@sgl.ru. Прочел?
Всего Вам самого самого доброго, уважаемые господа!
19 ноя 06, 20:55    [3421512]     Ответить | Цитировать Сообщить модератору
 Re: Годы Месяцы Дни  [new]
Владимир Саныч
Member

Откуда: Израиль (причем это 1 человек, а не 2 => прошу на ты)
Сообщений: 40414
ЮрИван
Владимиру Санычу - письмо написал на sanych@sgl.ru. Прочел?

Не-а. Адрес неправильный. SQL, а не SGL.
19 ноя 06, 21:30    [3421546]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить