Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Нужна помощь   Найти похожие ветки 

 
Прохожев Максим   (2007-02-16 10:18) [0]

Добрый день !!! Мне нужна помощь, я только изучаю дельфи, не могу решить самостоятельно. В общем есть функция которая подсчитывает количество дней между двумя датами, появилась необходимость откорректировать эту функцию так, что бы она брала по умолчанию 30 дней за месяц (любой месяц) Помогите исправить ее так. Заранее спасибо.

function DaysBetween(d1 : Integer;
    m1 : Integer;
    y1 : Integer;
    d2 : Integer;
    m2 : Integer;
    y2 : Integer):Integer;forward;

function DaysBetween(d1 : Integer;
    m1 : Integer;
    y1 : Integer;
    d2 : Integer;
    m2 : Integer;
    y2 : Integer):Integer;
var
   n1 : Integer;
   n2 : Integer;
begin
   if m1>2 then
   begin
       m1 := m1+1;
   end
   else
   begin
       m1 := m1+13;
       y1 := y1-1;
   end;
   n1 := 36525*y1 div 100+306*m1 div 10+d1;
   if m2>2 then
   begin
       m2 := m2+1;
   end
   else
   begin
       m2 := m2+13;
       y2 := y2-1;
   end;
   n2 := 36525*y2 div 100+306*m2 div 10+d2;
   Result := n2-n1;
end;


 
Johnmen ©   (2007-02-16 10:21) [1]

Чтобы не заниматься ерундой, почитай хелп на TDateTime и далее по ссылкам. Это основы.


 
Рамиль ©   (2007-02-16 10:25) [2]

Вобщем случае разница в днях это просто Date2 - Date1

P. S. IncDay круче :).


 
Прохожев Максим   (2007-02-16 10:26) [3]

Да, я согласен. Читать буду. Просто сейчас эта проблема критична, мне ее нужно решить сегодня. Так бы не стал заходить на сайт, просто время поджимает. Подскажите плиз.


 
Сергей М. ©   (2007-02-16 10:29) [4]


> 30 дней за месяц (любой месяц)


Особенно февраль ?


 
Прохожев Максим   (2007-02-16 10:31) [5]

> Особенно февраль

Обсолютно все месяца по умолчанию должны быть как 30 дней.


 
Сергей М. ©   (2007-02-16 10:32) [6]


> Обсолютно все месяца по умолчанию должны быть как 30 дней.


Бред какой-то...

Что за "умолчание" ?
Где и как ты что-то там "умалчиваешь" ?
Объясни вразумительно ...


 
Elen ©   (2007-02-16 10:33) [7]


> Прохожев Максим   (16.02.07 10:18)

DaysBetween из модуля DateUtils


 
Прохожев Максим   (2007-02-16 10:39) [8]

> Объясни вразумительно ...

В общем такая ситуация. Мне дали тех.задание на работе (Кредитный отдел)
написать программу там по отчетам всяким с выгрузкой в Excel. Есть формула где для подсчета необходимо количество дней между датами. Раньше я просто с помощью данной функции подсчитывал дни между двумя датами, и программа работала отлично . Сегодня мне сообщили что наш кредитный отдел округляет месяца по 30 дней. Это уже не моя инициатива, я просто тот кто должен делать то, что сказали. Соответственно теперь программа решает не правильно так как в разных месяцах разные количество дней.


 
Рамиль ©   (2007-02-16 10:41) [9]


> Прохожев Максим   (16.02.07 10:31) [5]
>
> Обсолютно все месяца по умолчанию должны быть как 30 дней.
>

Насколько я понял

Result := (Date2 - Date1) / 30


 
Сергей М. ©   (2007-02-16 10:44) [10]

Т.е. , если я правильно понял, необходимо определить число дней между указанными начальной и конечной датами и округлить результат до 30 ?

Если так, то каковы правила округления ?


 
Сергей М. ©   (2007-02-16 10:45) [11]


> Рамиль ©   (16.02.07 10:41) [9]


Функция-то у автора называется DaysBetween, а не MonthsBetween


 
ЮЮ ©   (2007-02-16 10:47) [12]

Уточни ТЗ у руководителя.
Нужно, чтобы между 01.01.06 и 01.01.07 было ровно 360 дней?
Сколько должно быть между
01.01.06 и 31.12.06 ?
01.01.06 и 30.12.06 ?

Ты же считаешь  DaysBetween, которое вычисляется абсольно точно.
Я понимаю, еслибв надо бвло найти кол-во целых месяцев + дней. А здесь зачем извращения?


 
Прохожев Максим   (2007-02-16 10:58) [13]

Пример:

01.01.2006 по 01.02.2006 = 30 дней

01.01.2006 по 10.02.2006 = 39 дней


 
Прохожев Максим   (2007-02-16 11:00) [14]

В году 360 дней должно быть.


 
Johnmen ©   (2007-02-16 11:03) [15]

>Прохожев Максим   (16.02.07 10:58) [13]

28.01.2006 по 28.02.2006 = ?

28.01.2006 по 28.03.2006 = ?

28.01.2006 по 01.03.2006 = ?

Сколько здесь?


 
Прохожев Максим   (2007-02-16 11:12) [16]

28.01.2006 по 28.02.2006 = 30
28.01.2006 по 28.03.2006 = 60
28.01.2006 по 01.03.2006 = 33


 
Плохиш ©   (2007-02-16 11:14) [17]


Result := MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2), Date2);

Что-то типа этого :-)


 
Плохиш ©   (2007-02-16 11:18) [18]


> Плохиш ©   (16.02.07 11:14) [17]

Хотя надо ещё добавить + DaysBetween(Date1, EndOfTheMonth(Date1)) :-))


 
Прохожев Максим   (2007-02-16 11:28) [19]

Result := MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2), Date2);

Что то не компилится, Statment expected, but expression of type integer found :(


 
Прохожев Максим   (2007-02-16 11:32) [20]

АААА все понял. Сейчас проверю)))С ошибкой разобрался.


 
Плохиш ©   (2007-02-16 11:33) [21]

Date1, Date2: TDatetime;

PS. в [18] надо поставить минус вместо плюса.


 
Прохожев Максим   (2007-02-16 11:36) [22]

MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2),Date2)+ DaysBetween(Date1, EndOfTheMonth(Date1));

Совсем не правильно считает :(


 
Плохиш ©   (2007-02-16 11:38) [23]


> Прохожев Максим   (16.02.07 11:36) [22]

Второй плюс замени на минус.


 
Прохожев Максим   (2007-02-16 11:50) [24]

Date1:= StrToDate("01.01.2006");
 Date2:= StrToDate("01.05.2006");

 i:=MonthsBetween(Date2, Date1) * 30 + DaysBetween(StartOfTheMonth(Date2),Date2)- DaysBetween(Date1, EndOfTheMonth(Date1));

Результат: 60 дней как 2 месяца берет.


 
ЮЮ ©   (2007-02-16 12:08) [25]

Код писать ломота. Суть:
 d1.m1.y1  d2.m2.y2

кол-во полных (с 01 по 30-е) месяцев  m12              
01.(m1 + 1.y1)  - 01.m2.y2

дней в левом месяце n1
30 - d1 + 1
дней в правом месяце n2
d2

dd = m12 * 30 + n1 + n2


 
Прохожев Максим   (2007-02-16 12:12) [26]

Мастера, помогите плиз.  Мне больше ненакого надеяться. :-(


 
Прохожев Максим   (2007-02-16 12:15) [27]


> Код писать ломота. Суть:
>  d1.m1.y1  d2.m2.y2
>
> кол-во полных (с 01 по 30-е) месяцев  m12              
> 01.(m1 + 1.y1)  - 01.m2.y2
>
> дней в левом месяце n1
> 30 - d1 + 1
> дней в правом месяце n2
> d2
>
> dd = m12 * 30 + n1 + n2


Сейчас попробую..


 
fd979 ©   (2007-02-16 12:17) [28]

Попробуй так:
Function DAYS360(pDateFrom, pDateTo: TdateTime): Integer;

Var
   d1, m1, Y1, d2, m2, y2 : Integer;
   dtTemp1: Double;
begin
 d1 := dayof(pDateFrom);
 m1 := monthof(pDateFrom);
 Y1 := yearof(pDateFrom);
 d2 := dayof(pDateTo);
 m2 := monthof(pDateTo);
 y2 := yearof(pDateTo);
 dtTemp1 := pDateFrom + 1;
 If (dayof(dtTemp1) = 1) And (monthof(dtTemp1) = 3) Then
     d1 := 30;
 If (d2 = 31) And (d1 = 30) Then
     d2 := 30;

 Result := Trunc(Int(((y2 - Y1) * 360) + ((m2 - m1) * 30) + (d2 - d1)));
End;


 
fd979 ©   (2007-02-16 12:21) [29]

Я проверил работает нормально - как ты указал:


> Прохожев Максим   (16.02.07 11:12) [16]
> 28.01.2006 по 28.02.2006 = 30
> 28.01.2006 по 28.03.2006 = 60
> 28.01.2006 по 01.03.2006 = 33


 
Прохожев Максим   (2007-02-16 12:36) [30]


> Function DAYS360(pDateFrom, pDateTo: TdateTime): Integer;
>
>
> Var
>    d1, m1, Y1, d2, m2, y2 : Integer;
>    dtTemp1: Double;
> begin
>  d1 := dayof(pDateFrom);
>  m1 := monthof(pDateFrom);
>  Y1 := yearof(pDateFrom);
>  d2 := dayof(pDateTo);
>  m2 := monthof(pDateTo);
>  y2 := yearof(pDateTo);
>  dtTemp1 := pDateFrom + 1;
>  If (dayof(dtTemp1) = 1) And (monthof(dtTemp1) = 3) Then
>      d1 := 30;
>  If (d2 = 31) And (d1 = 30) Then
>      d2 := 30;
>
>  Result := Trunc(Int(((y2 - Y1) * 360) + ((m2 - m1) * 30)
> + (d2 - d1)));
> End;


А в Uses что нибудь нужно подключать ??? Ато у меня ошибка выходит.


 
Elen ©   (2007-02-16 12:38) [31]


>  Ато у меня ошибка выходит.

Какая?


 
Прохожев Максим   (2007-02-16 12:42) [32]

Проблема снята, всем спасибо.

2 fd979, отдельное большое спасибо !!!


 
Desdechado ©   (2007-02-16 12:52) [33]

Я не пойду к вам брать кредит. Жулики какие-то...


 
iXT ©   (2007-02-16 14:30) [34]

А что за банк? :)
Непойму, как так можно проценты считать

Знавал я одну контору у которых (100 + 3%) + 5% = 108 :) Причем контора была не мелкая, да и сейчас живет :)



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.043 c
3-1165414254
novill
2006-12-06 17:10
2007.03.04
IB 7.5 Как можно получить тексты всех триггеров?


15-1171022264
vajo
2007-02-09 14:57
2007.03.04
Spoolsv.exe


2-1171036455
Дрон
2007-02-09 18:54
2007.03.04
Процессор и температура


3-1165068946
Armot
2006-12-02 17:15
2007.03.04
Информационные базы докуметнов


2-1171351666
kilop
2007-02-13 10:27
2007.03.04
Как отправить на печать текстовый файл?