Имя: Пароль:
1C
 
Количество полных лет между двумя датами
,
0 Baloven
 
07.12.09
05:24
Чтот не могу сообразить по поводу сабжа? как посчитать количество полных лет между двумя датами? :(
1 Rie
 
07.12.09
05:30
Вычти годы и поправь на 1 по результатам сравнения номеров дней в году.
2 Baloven
 
07.12.09
05:40
хм.. в принципе понял, только все же проверку нужно делать не номера дня в году а сравнивать номера месяца и номера дня в месяце - иначе получим глюк в високосном году в одни и те же день месяца после 29 февраля.
за подсказку спасибо
3 Rie
 
07.12.09
05:45
(2) Тогда может быть так:
Д1 = Год(Дата1)*10000+Месяц(Дата1)*100+День(Дата1);
Д2 = Год(Дата2)*10000+Месяц(Дата2)*100+День(Дата2);
ЧислоЛет = Цел((Д2-Д1)/10000);
4 Толич
 
07.12.09
05:52
(0)
Д1 = Число(Прав(Строка(Дата1),4));
Д2 = Число(Прав(Строка(Дата2),4));
ЧислоЛет = Д2-Д1;
5 Baloven
 
07.12.09
05:55
(4) адназначно не правильно
напрмиер
Дата1 = 01.02.2001
Дата2 = 15.01.2009
тогда получится результат 8 лет по вашему - а это не так!!!
6 Rie
 
07.12.09
05:57
(4) Однако не проще ли вместо Число(Прав(Строка(Дата1),4) написать Год(Дата1)?
7 Baloven
 
07.12.09
05:59
хоть так, хоть эдак - вариант (5) не даст правильного результата
8 Толич
 
07.12.09
06:01
(5) Так разница 8 лет и получается.
(6) Проще. Проснуться надо))
(7) Почему?
9 Rie
 
07.12.09
06:04
(8) Нужно число _полных_ лет. А их в приведенном примере прошло 7.
10 Baloven
 
07.12.09
06:10
имхо совсем правильно как писал (2) (но и (3) считаю практичным вариантом)
Дата1 = Дата(2001,02,01);
Дата2 = ТекущаяДата(); //07.12.2009
ЧислоЛет = Год(Дата2) - Год(Дата1);
Если Месяц(Дата2) < Месяц(Дата1) Тогда
    ЧислоЛет = ЧислоЛет-1;
ИначеЕсли Месяц(Дата2) = Месяц(Дата1) И День(Дата2) < День(Дата1) Тогда
    ЧислоЛет = ЧислоЛет-1;
КонецЕсли;

как-то так если нигде не ошибся :) всем спасибо пошел проверять
11 Толич
 
07.12.09
06:14
(9) 2009-2001=8. Откуда 7 лет?
12 Рэйв
 
07.12.09
06:14
(0)
Процедура глРазобратьРазностьДат(Знач Дата1,Знач Дата2,Лет=0,Месяцев=0,Дней=0) Экспорт

  Лет = 0; Месяцев = 0; Дней = 0;
  Если Дата1>Дата2 Тогда
       
      ВременнаяДата = Дата1;
      Если ДатаЧисло(ВременнаяДата)<ДатаЧисло(Дата2) Тогда
          Дней = ВременнаяДата-ДобавитьМесяц(ВременнаяДата,-1);
          ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
      КонецЕсли;
      Если ДатаМесяц(ВременнаяДата)<ДатаМесяц(Дата2) Тогда
          ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
          Месяцев = 12;
      КонецЕсли;
      Лет        = Макс(             ДатаГод  (ВременнаяДата)-ДатаГод  (Дата2),0);
      Месяцев    = Макс(Месяцев    +ДатаМесяц(ВременнаяДата)-ДатаМесяц(Дата2),0);
      Дней    = Макс(Дней        +ДатаЧисло(ВременнаяДата)-ДатаЧисло(Дата2),0);

(C)ЕСИС
13 Рэйв
 
07.12.09
06:15
блин..не все скопировалось.
Вот так :
---------------
Процедура глРазобратьРазностьДат(Знач Дата1,Знач Дата2,Лет=0,Месяцев=0,Дней=0) Экспорт

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

КонецПроцедуры    // глРазобратьРазностьДат
14 Baloven
 
07.12.09
06:18
собственно почти это я и написал :)
15 Baloven
 
07.12.09
06:20
(11)
Дата1 = 01.02.2001
Дата2 = 15.01.2009
не наступил в данном варианте 8 год - он пойдет через 16 дней, т.е. полный 8ой год будет идти только с даты 15.01.2009 а у вас уже на Дату2 8 ПОЛНЫХ ЛЕТ!!! - это неправильно
16 Baloven
 
07.12.09
06:21
если у вас день рождения 15 декабря 1976 года то вам сейчас еще нет 33 полных лет :)
17 Trance_1C
 
07.12.09
06:29
Функция ПолучитьРезультатЗапроса_Запрос1()
   
   //Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ГОД), НАЧАЛОПЕРИОДА(&ПериодКонца, ГОД), ГОД) КАК РазностьЛет";
   //Параметры запроса
   Запрос.УстановитьПараметр("ПериодКонца",ПериодКонца);// Дата
   Запрос.УстановитьПараметр("ПериодНачала",ПериодНачала);// Дата
   Результат = Запрос.Выполнить();

   Возврат Результат;

КонецФункции //ПолучитьРезультатЗапроса_Запрос1
18 Trance_1C
 
07.12.09
06:29
Всех с добрым утром :)
19 Толич
 
07.12.09
06:31
(17) Монстр.
20 dk
 
07.12.09
06:38
(17) так что там с полными / неполными годами? )))
21 Baloven
 
07.12.09
06:42
(10) (13) (17) рабочие варианты
22 dk
 
07.12.09
06:43
(21) т.е. (17) правильно отрабатывает полные/ неполные года?
23 Trance_1C
 
07.12.09
06:44
(22) Нет он покажет 8
24 Baloven
 
07.12.09
06:46
:( хм а я последний не проверял
25 AlStorm
 
07.12.09
06:51
А теперь вопрос на стотыщ:
А если года високосные? :))))
26 dk
 
07.12.09
06:57
(25) отстреливать таких деньрожденцев ))
27 Trance_1C
 
07.12.09
06:58
Функция ПолучитьРезультатЗапроса_Запрос1()
   
   //Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА (ВЫРАЗИТЬ(РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 КАК ЧИСЛО(1, 0))) > РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365
   |            ТОГДА РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 - (1- ((ВЫРАЗИТЬ(РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 КАК ЧИСЛО(1, 0))) - РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365))
   |        ИНАЧЕ ВЫРАЗИТЬ(РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 КАК ЧИСЛО(1, 0))
   |    КОНЕЦ КАК РазностьЛет";
   //Параметры запроса
   Запрос.УстановитьПараметр("ПериодКонца",ПериодКонца);// Дата
   Запрос.УстановитьПараметр("ПериодНачала",ПериодНачала);// Дата
   Результат = Запрос.Выполнить();

   Возврат Результат;

КонецФункции //ПолучитьРезультатЗапроса_Запрос1
28 dk
 
07.12.09
06:58
(23) вычеркиваем из монстров )
29 Trance_1C
 
07.12.09
06:58
+(27) а вот этот покажет точную разницу полных лет
30 Trance_1C
 
07.12.09
06:59
+(29) Без поллитры не читать :)
31 dk
 
07.12.09
06:59
(30) високосные учел?
32 Trance_1C
 
07.12.09
07:05
Функция ПолучитьРезультатЗапроса_Запрос1()
   
   //Текст сформирован автоматически обработкой Универсальная консоль отчетов 2.6.7
   Запрос = Новый Запрос;
   Запрос.Текст = "ВЫБРАТЬ
   |    ВЫРАЗИТЬ(РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 КАК ЧИСЛО(1, 0)) КАК ОкрРазницаЛет,
   |    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ПериодНачала, ДЕНЬ), КОНЕЦПЕРИОДА(&ПериодКонца, ДЕНЬ), ДЕНЬ) / 365 КАК РазницаЛет
   |ПОМЕСТИТЬ РасчетРазницы
   |;
   |
   |////////////////////////////////////////////////////////////////////////////////
   |ВЫБРАТЬ
   |    ВЫБОР
   |        КОГДА РасчетРазницы.ОкрРазницаЛет > РасчетРазницы.РазницаЛет
   |            ТОГДА РасчетРазницы.РазницаЛет - (1 - (РасчетРазницы.ОкрРазницаЛет - РасчетРазницы.РазницаЛет))
   |        ИНАЧЕ РасчетРазницы.ОкрРазницаЛет
   |    КОНЕЦ КАК РазницаЛет
   |ИЗ
   |    РасчетРазницы КАК РасчетРазницы";
   //Параметры запроса
   Запрос.УстановитьПараметр("ПериодКонца",ПериодКонца);// Дата
   Запрос.УстановитьПараметр("ПериодНачала",ПериодНачала);// Дата
   Результат = Запрос.Выполнить();

   Возврат Результат;

КонецФункции //ПолучитьРезультатЗапроса_Запрос1

Так будет читабельней, високосные учитываются в общей массе дней разницы,
33 dk
 
07.12.09
07:08
а просто
РАЗНОСТЬДАТ(ПериодНачала, &ПериодКонца,ГОД) КАК РазностьЛет
не работает? )
34 Trance_1C
 
07.12.09
07:12
Работает но там просто происходит 2009-2001=8
там не учитывается что в 2001 был февраль, а в 2009 январь просто даты лет вычитаются....
35 Baloven
 
07.12.09
07:22
(32) опять же "/365" а если високосный? :
36 Baloven
 
07.12.09
07:24
не пойму чем вам не нравится-то (10) или (13)? погнял (в основном (10) вроде все ОК
37 Baloven
 
07.12.09
07:26
а может кто-нибудь здесь подсказать? v8: Доступ к дополнительным свойствам в справочнике УПП
38 Trance_1C
 
07.12.09
07:35
Ну хорошо вот здесь учитываются високосные достаточно точно.

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

   Возврат Результат;

КонецФункции //ПолучитьРезультатЗапроса_Запрос1
39 2mugik
 
07.12.09
07:51
(3) хм.. А если 2009.12.01 и 2008.01.01 сработает?
40 MoneG
 
07.12.09
08:20
(39) это фигня.. а вот если Дата(2012,12,12) сработает? )
41 dk
 
07.12.09
08:26
(38) "достаточно точно" надо будет запомнить ))
42 Trance_1C
 
07.12.09
09:38
(40) если это начало периода, то нет :(
43 Туц
 
07.12.09
10:07
_НачДата = НачДата;
   Сч = 0;
   Пока 1=1 Цикл
       _НачДата = ДобавитьМесяц(_НачДата,12);
       Если КонДата >= _НачДата Тогда
           Сч = Сч + 1;    
       Иначе
           Прервать;
       КонецЕсли;
   КонецЦикла;
   Сообщить(Сч);
))
44 Туц
 
07.12.09
10:11
Интересен случай с 29.02.08 - 28.02.09
45 Baloven
 
11.12.09
10:07
(44) имхо в данном варианте год еще не прошел - так как он пройдет 01.03.2009 и рузумеется результат будет 1 год и 1 месяц (должен быть), но в контексте поставленного вопроса (полных лет) - ответ собственно что не прошло полного года
46 Baloven
 
11.12.09
10:20
(45) сорри 1 год и 1 день :)
Программист всегда исправляет последнюю ошибку.