|
Количество полных лет между двумя датами | ☑ | ||
---|---|---|---|---|
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 день :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |