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