Имя: Пароль:
1C
1С v8
Разность двух дат
0 liza234
 
26.12.18
13:16
В базе имеется два поля: ДатаНачалаРаботы и ДатаОкончанияРаботы.Как посчитать стаж работы(в годах)?
1 Натуральный Йог
 
26.12.18
13:17
через РадностьДат
2 impulse9
 
26.12.18
13:19
// Периодичность - Строка.("Месяц", "Год")
Функция ПолучитьРазностьДат(ДатаВычитаемая, ДатаИзКоторойВычитаем, Периодичность)            


ТЗ = НОвый ТаблицаЗначений;    
ТЗ.Колонки.Добавить("Колонка", Новый ОписаниеТипов("Число"));    
ТЗ.Добавить().Колонка = 0;    
Запрос = Новый Запрос;    
Запрос.Текст = СтрЗаменить("ВЫБРАТЬ ПЕРВЫЕ 1    
|      РАЗНОСТЬДАТ(&ДатаВычитаемая, &ДатаИзКоторойВычитаем, &&Периодичность) КАК Разность    
|ПОМЕСТИТЬ ВТ_Таблица
|ИЗ    
|      &ТЗ КАК ТЗ    
|;    
|    
|////////////////////////////////////////////////////////////////////////////////    
|ВЫБРАТЬ ПЕРВЫЕ 1    
|      ВТ_Таблица.Разность КАК Разность          
|ИЗ    
|      ВТ_Таблица КАК ВТ_Таблица", "&&Периодичность", Периодичность);          
Запрос.УстановитьПараметр("ТЗ", ТЗ);    
Запрос.УстановитьПараметр("ДатаИзКоторойВычитаем", ДатаИзКоторойВычитаем);    
Запрос.УстановитьПараметр("ДатаВычитаемая",        ДатаВычитаемая);          
Возврат Запрос.Выполнить().Выгрузить()[0].Разность;    


КонецФункции
3 impulse9
 
26.12.18
13:26
Если УТ или ЕРП, то


// Возвращает разницу между двумя датами (в днях)
//
// Параметры
//  ДатаНачала         - Дата - начальная дата периода
//  ДатаОкончания    - Дата - конечная дата периода.
//
// Возвращаемое значение:
//   Число     - количество дней между двумя датами.
//
ОбщегоНазначенияУТ.РазностьДат(ДатаНачала, ДатаОкончания, Периодичность) Экспорт
4 liza234
 
26.12.18
13:29
Может есть ещё какой-то способ?
5 impulse9
 
26.12.18
13:31
указанные чем не устраивают?
6 liza234
 
26.12.18
13:34
Не очень понятный
7 Serg_1960
 
26.12.18
14:24
Как вариант, типовая функция (для стажа):

Процедура РазобратьРазностьДат(Дата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) Тогда
            Дней = Дней + ((ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) - Дата2)/86400;
            //(День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры    // РазобратьРазностьДат
8 Гипервизор
 
26.12.18
14:34
(0) А если стаж меньше года, тогда 0?
9 lEvGl
 
гуру
26.12.18
14:42
(8) это мелочь, можно написать Менее года, интересно как будет принялся/уволился/принялся. строк будет явно больше одной
10 иубиповец
 
26.12.18
14:47
А что в вашем понимании стаж? есть периоды не включаемые в стаж?
11 Натуральный Йог
 
26.12.18
15:04
(8) Если ты покупаешь 300 грамм колбасы, то платишь за 0 кг?
12 Гипервизор
 
26.12.18
15:10
(11) В регламентированной отчетности по форме 1-Колбаса будет округлено до 0.
Поскольку ТСу нужен результат именно в годах, хотелось бы уточнить, что он хочет видеть в случае стажа менее года.
13 bolobol
 
26.12.18
15:20
(12) "Может есть ещё какие-то вопросы? Не очень понятные" (по мотивам (4) (6))
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший