Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Количество дней между датами

Количество дней между датами
Я
   Amfiaray
 
22.05.18 - 06:21
Добрый день!

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

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

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

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

общий принцеп - делим период на года и для каждого года считаем свою разницу потом складываем
   Amfiaray
 
8 - 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 дней (((
   vde69
 
9 - 22.05.18 - 06:47
(0) как я понимаю надо что бы разности между датами были такими

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

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


распиши на примере для остальных....
   Sammo
 
10 - 22.05.18 - 06:50
Количество полных месяцев * 30 + остаток.
Если остаток > 30 - берм 30 дней
 
 Рекламное место пустует
   Amfiaray
 
11 - 22.05.18 - 06:56
(10) а если это февраль, то 28 = 30
   Sammo
 
12 - 22.05.18 - 06:57
В запросе - навскидку - разность дат в месяцах от начала месяца каждой даты, а затем доп анализ
1. Если день() от даты 1 (день с начала месяца) больше, чем день с даты 2, то разность дат (с учетом ограничений)
2. Если день от даты 1 меньше день от даты 2, то добавляем целый месяц (30 дней) + разница между дата 2 и дата1 + месяц
Как-то так.
   Sammo
 
13 - 22.05.18 - 07:00
(11) Да, с учетом ферваля была доп. логика. Что-то из серии, что если дата2 = конец месяца дата 1 и дата 1 = начала месяца дата 1, то 30.
Т.к. с февралем забавность - 30 дней только если с 01.02 по 28 (или 29 для високосного) февраля. с 02 по 28 - уже 27. С 01 по 27 - тоже 27 дней.
   Amfiaray
 
14 - 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)
КОНЕЦ
   catena
 
15 - 22.05.18 - 07:27
ВЫБРАТЬ
    &ДатаНач,
    &ДатаКон,
    РАЗНОСТЬДАТ(НачалоПериода(&ДатаНач, месяц), НачалоПериода(&ДатаКон, месяц), МЕСЯЦ) * 30 - 30 КАК ЦелыхМесяцев,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаНач, МЕСЯЦ), КОНЕЦПЕРИОДА(&ДатаНач, МЕСЯЦ), ДЕНЬ) + 1 КАК днейВМесНач,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаКон, МЕСЯЦ), КОНЕЦПЕРИОДА(&ДатаКон, МЕСЯЦ), ДЕНЬ) + 1 КАК днейВМесКон,
    РАЗНОСТЬДАТ(&ДатаНач, КОНЕЦПЕРИОДА(&ДатаНач, МЕСЯЦ), ДЕНЬ) + 1 КАК днейДоКОнцаНач,
    РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ДатаКон, МЕСЯЦ), &ДатаКон, ДЕНЬ) + 1 КАК днейСНачалаКон
ПОМЕСТИТЬ тзР
;

////////////////////////////////////////////////////////////////////////////////

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует