Имя: Пароль:
1C
1С v8
Количество лет в запросе
0 manti
 
27.01.15
16:22
У сотрудника есть опыт работы : начало месяц, начало год; окончание месяц; окончание год.
Все ревизиты имеют тип число, не дата! )

Подскажите алгоритм вычисления количества лет в разности таких дат.
1 Быдло замкадное
 
27.01.15
16:24
ну так посчитай кол-во месяцев в годе начала и кол-во месяцев в годе окончания. Да года вычти.
ВОт тебе кол-во месяцев и лет отдельно
2 Быдло замкадное
 
27.01.15
16:25
(12 - начало месяц) + окончание месяц

Это кол-во месяцев
3 Быдло замкадное
 
27.01.15
16:26
окончание год - начало год - 1

Это кол-во лет
4 manti
 
27.01.15
16:27
Например 8 месяц 2010года - 4 месяц 2012 года = 1 год 9 месяцев= 1.75 года ))
5 Быдло замкадное
 
27.01.15
16:29
получается (12 - 8) + 4 = 8 месяцев.
если тебе надо 9 месяцев то формула

13- 8 + 4 = 9 месяцев.

Года : 2012 - 2010 - 1 = 1 год.

9 месяцев далее делим на 12 = 0.75
6 Быдло замкадное
 
27.01.15
16:30
(окончание год - начало год - 1) + (13 - начало месяц + окончание месяц)/12
7 manti
 
27.01.15
16:38
(6) спасибо ))) не перевелись на мисте знатоки
8 Ненавижу 1С
 
гуру
27.01.15
16:41
(6) сокращаем:

(окончание год - начало год) + (окончание месяц - начало месяц + 1)/12
9 DirecTwiX
 
27.01.15
16:45
ДатаВремя() может обрабатывать отрицательные параметры?) Например, в качестве второго параметра?)
10 Ненавижу 1С
 
гуру
27.01.15
16:45
(9) ДатаВремя в запросе не функция
11 mikecool
 
27.01.15
16:46
(9) да, только разностьдат
12 mikecool
 
27.01.15
16:46
(7) нет, это ты думать не хочешь
13 ktvladimir
 
27.01.15
17:35
как то.. к примеру январь 13 и январь 14 по формуле
(2014 - 2013 - 1) + (13 - 1 + 1)/12 =
0 + 13/12 = 1 1/12 не то как то

смотрим февраль 14

(2014-2013-1) + (13-2+1)/12 = 1

декабрь 13

-1 + (13-12+1)/12 = -1 + 1/6
14 DirecTwiX
 
27.01.15
17:37
>смотрим февраль 14
Хреново подставляешь.
15 ktvladimir
 
27.01.15
17:42
ну ок да месяца перепутал
16 Flyd-s
 
27.01.15
17:48
(ГодОкончания * 12 + МесяцОкончания - ГодНачала*12 - МесяцНачала) /12
17 EvgeniuXP
 
27.01.15
17:52
че-то муторно, господа, можно легче намного :)
18 mikecool
 
27.01.15
18:19
криво считает, не проверял - почему )
Выбрать ДатаВремя(2012,9,24) Как Дата1, ДатаВремя(2015,01,27) Как Дата2
Поместить _ВТ_Даты;

Выбрать РазностьДат(_ВТ_Даты.Дата1, _ВТ_Даты.Дата2, Год) - 1 Как Лет
Поместить _ВТ_КоличествоЛет;

Выбрать РазностьДат(_ВТ_Даты.Дата1, ДобавитьКДате(_ВТ_Даты.Дата1, Год, _ВТ_КоличествоЛет.Лет), День) Как ДнейВГодах,
ДобавитьКДате(ДобавитьКДате(_ВТ_Даты.Дата1, Год, _ВТ_КоличествоЛет.Лет), День, 1) Как ДатаДляМесяцев
Поместить _ВТ_ДнейВГодах;

выбрать РазностьДат(_ВТ_ДнейВГодах.ДатаДляМесяцев, _ВТ_Даты.Дата2, Месяц) - 1 Как Месяцев
Поместить _ВТ_КоличествоМесяцев;

выбрать РазностьДат(_ВТ_ДнейВГодах.ДатаДляМесяцев, ДобавитьКДате(_ВТ_ДнейВГодах.ДатаДляМесяцев, Месяц, _ВТ_КоличествоМесяцев.Месяцев), День) Как ДнейВМесяцах,
ДобавитьКДате(ДобавитьКДате(_ВТ_ДнейВГодах.ДатаДляМесяцев, Месяц, _ВТ_КоличествоМесяцев.Месяцев), День, 1) Как ДатаДляДней
поместить _ВТ_ДнейВМесяцах;

выбрать _ВТ_КоличествоЛет.Лет, _ВТ_КоличествоМесяцев.Месяцев, РазностьДат(_ВТ_Даты.Дата1, _ВТ_Даты.Дата2, День) - _ВТ_ДнейВГодах.ДнейВГодах - _ВТ_ДнейВМесяцах.ДнейВМесяцах
19 marvak
 
27.01.15
18:25
(0)
//У меня есть функция, которая вычисляет возраст.
//Не встречал еще варианта, когда она выдавала //некорректный результат

Если ДатаРождения = Дата("00010101000000") Тогда
   Возврат 0;
Иначе
// Число полных лет между текущей датой и датой рождения
   Возврат Цел((ТекущаяДата() - ДатаРождения) / (60 * 60 * 24 * 365.25));
КонецЕсли;

В запрос я думаю перевести несложно будет.
Вместо ТекущаяДата() и ДатаРождения подставь начальные даты месяцев начала и окончания работы
ПервоеЧислоМесяца, МесяцНачала, ГодНачала - перевести в дату несложно.
20 DirecTwiX
 
27.01.15
18:33
(19)
ДатаРождения = '20140101';
ТекущаяДата = '20150101';
21 marvak
 
27.01.15
18:42
(20)
Это к чему?
22 marvak
 
27.01.15
18:43
(21)+
в дату преобразовать вне запроса и как параметры передать
23 DirecTwiX
 
27.01.15
18:55
(21) Это к вариантам с некорректными результатами :)
24 marvak
 
27.01.15
18:58
(23)
у меня 1 год получается
25 DirecTwiX
 
27.01.15
19:03
(24)
('20150101'-'20140101')/ (60 * 60 * 24 * 365.25) = 0,999315537303216974674880219    

Вот и мой вариант :D
РазностьДат(&ДатаРождения, &ТекущаяДата, Месяц)/12
26 marvak
 
27.01.15
19:33
(25)
Да, есть такая ошибка, в практике не вылезала никогда.
Граничные моменты не учтены.

наверное надо так:
Возврат Цел((КонецДня(ТекущаяДата()) - ДатаРождения) / (60 * 60 * 24 * 365.25))
27 DirecTwiX
 
27.01.15
19:44
(26) С високосными тогда проблема будет..
ТекущаяДата = 31.12.2012 23:59:59
ДатаРождения = 01.12.2014

Либо забить, либо менять на (6)-(8) :)
28 DirecTwiX
 
27.01.15
19:44
(27)
*ДатаРождения = 01.12.2012
29 marvak
 
27.01.15
22:19
(28)
не вроде проблемы
В окне табло показывает так
Цел((КонецДня(Дата("20121231235959")) - Дата("20121201000000")) / (60 * 60 * 24 * 365.25)) = 0
что в общем то верно
30 marvak
 
27.01.15
22:21
(29)+
Для (0) наверное не подойдет эта формула, нас в общем устраивает на 99%.
Такие "особые" моменты в реальной работе с базой не встречаются.
31 DirecTwiX
 
27.01.15
22:54
(29) Конечно же 01.01.2012, а не 01.12.2012 :)
32 marvak
 
28.01.15
09:58
(31) 31.12.2012 вряд ли кто то в базе сидит! Да и возраст почти год, так что норм.
)))
33 EvgeniuXP
 
28.01.15
21:40
эх, вы, так простое решение никто и не написал - * 365.25 это не дело. Оригинальность в том, что даже не надо париться високосный/не високосный год :)
34 marvak
 
28.01.15
21:52
(33)
Так не томИ, напиши уже.
35 deniseek
 
28.01.15
22:18
(34) Если только целые годы, то:

РАЗНОСТЬДАТ(ДобавитьКДате(ДатаВремя(1,1,1),ГОД,&Год1), ДобавитьКДате(ДатаВремя(1,1,1),ГОД,&Год2)..., Год)
36 marvak
 
29.01.15
21:28
переделал нафик формулу в (19) :)

может кто найдет ошибку, если будет желание?

Функция ПолучитьВозраст(ДатаРождения) Экспорт
    
    ТекДата = ТекущаяДата();
    ТекущийМесяц = Месяц(ТекДата);
    РожденияМесяц = Месяц(ДатаРождения);
    ТекущийГод = Год(ТекДата);
    РожденияГод = Год(ДатаРождения);
    ТекущийДень = День(ТекДата);
    РожденияДень = День(ДатаРождения);
    
    // Число полных лет между текущей датой и датой рождения
    
    Если Не ЗначениеЗаполнено(ДатаРождения) Или (ДатаРождения > ТекДата) Тогда
        Возврат 0;
    Иначе
        Если ТекущийГод = РожденияГод Тогда
            Возврат 0;
        Иначе
            Если ТекущийМесяц < РожденияМесяц Тогда
                Возврат ТекущийГод - РожденияГод - 1;
            ИначеЕсли ТекущийМесяц > РожденияМесяц Тогда
                Возврат ТекущийГод - РожденияГод;
            ИначеЕсли ТекущийМесяц = РожденияМесяц Тогда
                Если ТекущийДень < РожденияДень Тогда
                    Возврат ТекущийГод - РожденияГод - 1;
                Иначе
                    Возврат ТекущийГод - РожденияГод;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
    
КонецФункции