Имя: Пароль:
1C
 
Разность дат 1С 8.1
0 Викуся
 
22.03.10
08:45
Для сотрудника есть периоды работы в одном подразделении, например
Иванов 01.02.2003-14.04.2005
Иванов 11.03.2007-15.09.2008
Иванов 28.07.2009-...

Как посчитать общую продолжительность работы, типо 4 года 5 мес 23 дня?
1 zak555
 
22.03.10
08:49
2 Defender aka LINN
 
22.03.10
08:50
Вычислить продолжительность всех периодов и сложить
3 kitt
 
22.03.10
08:50
(ДатаКон - ДатаНач)= КоличествоСекундМеждуДатами
4 zak555
 
22.03.10
08:50
5 zak555
 
22.03.10
08:50
6 kitt
 
22.03.10
08:50
да, тяжело приходится мистянам без ТелепатБота
7 Викуся
 
22.03.10
08:50
(3)если все перевести в секунды будет неточно!
8 kitt
 
22.03.10
08:51
(7) нужно милисекунды чтоли?
9 Невский Александр
 
22.03.10
08:51
Нужно учитывать високосные годы при расчете
РазностьДат
10 zak555
 
22.03.10
08:51
(7) сделай начало дня !
11 shamannk
 
22.03.10
08:52
ЧислоМес = Окр((НачалоДня(ДатаК) - НачалоДня(ДатаН)) /  (24*60*60*30.4));
Если ЧислоМес>=12 Тогда
   Год = Цел(ЧислоМес/12);
   ЧислоМес = ЧислоМес - (Год*12);
   Если ЧислоМес=0 Тогда
   ОбластьМакета.Параметры.Период = Строка(Год) + " г. ";    
   Иначе
   ОбластьМакета.Параметры.Период = Строка(Год) + " г. " + Строка(ЧислоМес) + " мес.";
   КонецЕсли;
Иначе
   ОбластьМакета.Параметры.Период = Строка(ЧислоМес) + " мес.";
КонецЕсли;
12 zak555
 
22.03.10
08:52
13 Викуся
 
22.03.10
08:52
Разность дат даст общее количество лет, месяцев или дней. А мне надо в формате 5 лет 11 мес 30 дней
14 Викуся
 
22.03.10
08:53
(12) Там другая задача была. Посчитать без запроса
15 zak555
 
22.03.10
09:00
В стандартном ЗУПе есть

// Процедура вычисляет количество лет, месяцев и дней между двумя датами

//

// Параметры

//  Дата1    – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)

//  Дата2    – дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)

//  Лет        – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)

//  Месяцев    – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)

//  Дней    – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)

//

Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
   
   Лет        = 0;
   Месяцев    = 0;
   Дней    = 0;
   Если Дата1 > Дата2 Тогда
       
       ВременнаяДата = Дата1;
       Если День(ВременнаяДата) < День(Дата2) Тогда
           Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
       КонецЕсли;
       Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
           Месяцев = 12;
       КонецЕсли;
       Лет        = Макс(             Год(ВременнаяДата)        - Год(Дата2),    0);
       Месяцев    = Макс(Месяцев    + Месяц(ВременнаяДата)    - Месяц(Дата2),    0);
       Дней    = Макс(Дней        + День(ВременнаяДата)    - День(Дата2),    0);
       
       // скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах

       Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
           Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
       КонецЕсли;
       
   КонецЕсли;

КонецПроцедуры    // РазобратьРазностьДат
16 shamannk
 
22.03.10
09:04
(0)А чем мой вариант не нравиться? (11)
17 Викуся
 
22.03.10
09:39
А как потом складывать разности дат? Допустим из первого периода получилось 1 год 5 мес 3 дня, из второго 2 года 4 мес 27 дней. Как эти суммарные дни в месяц преобразовать?
18 zak555
 
22.03.10
09:39
(17) зачем ?
19 Викуся
 
22.03.10
09:42
(18)чтоб общую длительность работы определить.
20 zak555
 
22.03.10
09:43
(19) сложи все секунды, а потом подсчитай разность дат
21 Викуся
 
22.03.10
09:45
(20)01.01.0001 + СуммаСекунд?
22 zak555
 
22.03.10
09:46
(21) в (17)
>> 1 год 5 мес 3 дня, из второго 2 года 4 мес 27 дней


это получено как ?
23 Викуся
 
22.03.10
09:49
(22)Запросом.
Тогда это получать вообще не надо. Просто сумму секунд?
24 zak555
 
22.03.10
09:52
(23) да, суммируй разности дат (секунд)
25 Serg_1960
 
22.03.10
10:24
Период с 01.01.2005 по 01.01.2006 - ровно один год (365 дней, 31536000сек)
Период с 01.01.2004 по 01.01.2005 - ровно один год (но: 366 дней, 31622400сек)
26 Викуся
 
22.03.10
11:37
(22)есть другое предложение?
27 Викуся
 
22.03.10
11:38
+ (26)Это к Сержу 1960
28 Serg_1960
 
22.03.10
12:00
Спросите как сделать у расчетчика - отвечать ему, если что не так, а не мне.

У нас делают так: каждый период раскладывают на года, месяца и дни (с учетом високосных). Потом "тупо" суммируют: каждые 30 дней переводят в полные месяца, а каждые 12 месяцев - в полные годы.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан