Имя: Пароль:
1C
1С v8
Количество дней между датами
,
0 Amfiaray
 
22.05.18
06:21
Добрый день!

Подскажите как получить количество дней между двумя датами при условии что количество дней в году 360, а количество дней в месяце 30.
1 craxx
 
22.05.18
06:24
(ДатаПоздняя-ДатаРанняя)/86400
2 craxx
 
22.05.18
06:25
(1) Ну и округлить
3 vde69
 
22.05.18
06:27
(1) не правильно, читаем сабж внимательно...

количество дней в году 360 !
4 vde69
 
22.05.18
06:28
(0) тебе для начисления процентов?
5 Amfiaray
 
22.05.18
06:29
(4) Да, там много вариантов, в году может быть от 360 до 367 дней, в зависимости от базы расчета
6 vde69
 
22.05.18
06:31
(4) + если да, то примерно так (в запросе)

Выразить(РазностьДат(началопериода(дата1,день),началопериода(дата2,день))/365*360 как число 3.0)
7 vde69
 
22.05.18
06:33
(5) правда есть нюансы перехода через год...

я писал функцию, она довольно объемная вышла, правда это было лет 10 назад... не найду сейчас...

общий принцеп - делим период на года и для каждого года считаем свою разницу потом складываем
8 Amfiaray
 
22.05.18
06:46
(7) Так и делал

РазностьЛет = (Год(Дата2)-Год(Дата1))*360;
РазностьМесяцев = (Месяц(Дата2)-Месяц(Дата1))*30;
РазностьДней = День(Дата2)-День(Дата1);
РазностьДат = РазностьЛет+РазностьМесяцев+РазностьДней;

Проблема в количестве дней в месяце

Например Дата1 = 01.03.2017; Дата2 = 28.02.2018 Количество дней должно быть 360, вариант как в (4) дает 359 дней, вариант как у меня дает 357 дней (((
9 vde69
 
22.05.18
06:47
(0) как я понимаю надо что бы разности между датами были такими

1янв - 30янв = 29 дней
1янв - 31янв = 30 дней
1янв - 1февраля = 30 дней
1янв - 2февраля = 31 дней

1февр - 1 марта = 30 дней


распиши на примере для остальных....
10 Sammo
 
22.05.18
06:50
Количество полных месяцев * 30 + остаток.
Если остаток > 30 - берм 30 дней
11 Amfiaray
 
22.05.18
06:56
(10) а если это февраль, то 28 = 30
12 Sammo
 
22.05.18
06:57
В запросе - навскидку - разность дат в месяцах от начала месяца каждой даты, а затем доп анализ
1. Если день() от даты 1 (день с начала месяца) больше, чем день с даты 2, то разность дат (с учетом ограничений)
2. Если день от даты 1 меньше день от даты 2, то добавляем целый месяц (30 дней) + разница между дата 2 и дата1 + месяц
Как-то так.
13 Sammo
 
22.05.18
07:00
(11) Да, с учетом ферваля была доп. логика. Что-то из серии, что если дата2 = конец месяца дата 1 и дата 1 = начала месяца дата 1, то 30.
Т.к. с февралем забавность - 30 дней только если с 01.02 по 28 (или 29 для високосного) февраля. с 02 по 28 - уже 27. С 01 по 27 - тоже 27 дней.
14 Amfiaray
 
22.05.18
07:16
Вот код запроса, вроде как всё правильно считает:

(ВЫРАЗИТЬ(ГОД(&дата2) - ГОД(&дата1) КАК ЧИСЛО(3, 0))) * 360 + (ВЫРАЗИТЬ(МЕСЯЦ(&дата2) - МЕСЯЦ(&дата1) КАК ЧИСЛО(3, 0))) * 30 + ВЫБОР
    КОГДА КОНЕЦПЕРИОДА(&Дата2, ДЕНЬ) = КОНЕЦПЕРИОДА(&Дата2, МЕСЯЦ)
        ТОГДА 30
    КОГДА НАЧАЛОПЕРИОДА(&Дата2, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата2, МЕСЯЦ)
        ТОГДА 0
    ИНАЧЕ ДЕНЬ(&Дата2)
КОНЕЦ - ВЫБОР
    КОГДА КОНЕЦПЕРИОДА(&Дата1, ДЕНЬ) = КОНЕЦПЕРИОДА(&Дата1, МЕСЯЦ)
        ТОГДА 30
    КОГДА НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) = НАЧАЛОПЕРИОДА(&Дата1, МЕСЯЦ)
        ТОГДА 0
    ИНАЧЕ ДЕНЬ(&Дата1)
КОНЕЦ
15 catena
 
22.05.18
07:27
ВЫБРАТЬ
    &ДатаНач,
    &ДатаКон,
    РАЗНОСТЬДАТ(НачалоПериода(&ДатаНач, месяц), НачалоПериода(&ДатаКон, месяц), МЕСЯЦ) * 30 - 30 КАК ЦелыхМесяцев,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНач, МЕСЯЦ), КОНЕЦПЕРИОДА(&ДатаНач, МЕСЯЦ), ДЕНЬ) + 1 КАК днейВМесНач,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаКон, МЕСЯЦ), КОНЕЦПЕРИОДА(&ДатаКон, МЕСЯЦ), ДЕНЬ) + 1 КАК днейВМесКон,
    РАЗНОСТЬДАТ(&ДатаНач, КОНЕЦПЕРИОДА(&ДатаНач, МЕСЯЦ), ДЕНЬ) + 1 КАК днейДоКОнцаНач,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаКон, МЕСЯЦ), &ДатаКон, ДЕНЬ) + 1 КАК днейСНачалаКон
ПОМЕСТИТЬ тзР
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    тзР.ДатаНач,
    тзР.ДатаКон,
    тзР.ЦелыхМесяцев,
    тзР.днейВМесНач,
    тзР.днейВМесКон,
    тзР.днейДоКОнцаНач,
    тзР.днейСНачалаКон,
    Выразить(тзР.ЦелыхМесяцев+ тзР.днейДоКОнцаНач*30/тзР.днейВМесНач + тзР.днейСНачалаКон*30/тзР.днейВМесКон как число(3,0)) как Итог
ИЗ
    тзР КАК тзР
16 SleepyHead
 
гуру
22.05.18
07:41
(0) Для какой планеты код пишете?
17 Amfiaray
 
22.05.18
08:02
(16) Для планеты "Земля", учет операций по ценным бумагам, в правилах написано что расчет купона вознаграждения производится в зависимости от выбранной базы расчета, а вот базы расчеты бывают:
•    Американский (NASD) 30/360;
•    Фактический/фактический;
•    Фактический/360;
•    Фактический/365;
•    Европейский 30/360;
•    Фактический/364;
•    Фактический/366;
•    Фактический/367
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.