| 
    
        
     
     | 
    
  | 
Количество лет в запросе | ☑ | ||
|---|---|---|---|---|
| 
    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';
     | 
|||
| 
    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; Иначе Возврат ТекущийГод - РожденияГод; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; КонецФункции  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |