DBGrid подсчет времени в столбце

 
0
 
Delphi, Kylix & Pascal
ava
ulmralex | 09.04.2013, 20:11
Скажите, а как сделать, что бы подсчитывало время в столбце правильно?
Такая процедура на кнопку, она работает:

    procedure TForm13.Button6Click(Sender: TObject);
    var s:TDateTime;
    i:integer;
    begin
    S:=0;
    i:=ADOQuery1.RecNo;
    ADOQuery1.DisableControls;
    ADOQuery1.First;
    while not(ADOQuery1.Eof) do
      begin
        S:=S+ADOQuery1.FieldByName('it_vrema').AsDateTime;
        ADOQuery1.Next;
      end;
    ADOQuery1.RecNo:=i;
    ADOQuery1.EnableControls;
    edit6.Text:=FormatDateTime('HH:mm', s);
           end;

Но!:
Даны числа: 07:14 + 05:49 + 07:05 + 10:45. Результат должен по идее получится: 30:53
Но выводит как 6:53.
Т.е. получается до 23:59 он считает нормально.
Как сделать и где выставить правильный формат вывода времени?
Просто есть такое понятие, как отработка месячного балла сотрудником. Вот и считается его ненормированное время, к примеру: 07:14 + 05:49 + 07:05 + 10:45
т.е. 1.04.13 сотрудник отработал 07:14 часов, а 2.04.13 отработал 05:49, вот и надо посчитать за определенный период месяца его отработанные часы...

В DBGrid в ячейках время в формате HH:mm 
Comments (13)
ava
kami | 09.04.2013, 21:02 #
Цитата (ulmralex @  9.4.2013,  19:11 findReferencedText)
Т.е. получается до 23:59 он считает нормально.

естественно, дальнейшее увеличение TDateTime приведет к "переходу" на следующий день и "обнулению" текущих часов/минут/секунд/миллисекунд.

Не проверял, пишу навскидку:

var
  Hours, Mins: int64;
.......
  // перед выводом значения:
  Hours:=HoursBetween(0, S);
  Mins:=MinutesBetween(0, S) - Hours*60;
  edit6.Text:=IntToStr(Hours)+':'+IntToStr(Mins);

ava
Чучмек | 09.04.2013, 21:42 #

Text:=floattostr(HourSpan(s,0)); // число часов
Text:=floattostr(HoursBetween(s,0));//число целых часов
ava
Akella | 09.04.2013, 21:49 #
Цитата (ulmralex @  9.4.2013,  19:11 findReferencedText)
Даны числа: 07:14 + 05:49 + 07:05 + 10:45. Результат должен по идее получится: 30:53


пойми, что время так показывается только на экран, на самом деле и время, и дата - это число с плавающей точкой
почитай, как хранится время и дата в delphi и сразу проясниться многое

added later:
В целой части значения типа TDateTime хранится количество дней отсчитывая от момента: 1899.12.30, а в дробной части хранится оставшаяся доля дня в миллисекундах (вроде бы).
ava
Данкинг | 09.04.2013, 22:00 #
Вообще-то в данном случае надо считать именно разницу часов (как числовой тип), и её уже суммировать. А тут ты время ко времени прибавляешь.
ava
northener | 09.04.2013, 22:14 #
Цитата (Akella @  9.4.2013,  21:49 findReferencedText)
а в дробной части хранится оставшаяся доля дня в миллисекундах

а в дробной части хранится оставшаяся доля дня в долях дня smile
ava
Akella | 09.04.2013, 23:13 #
в каких долях дня?
ava
northener | 10.04.2013, 00:23 #
Цитата (Akella @  9.4.2013,  23:13 findReferencedText)
в каких долях дня? 

Ну если верить справке, то вплоть до 5.0 x 10^–324 дня. Если мы конечно говорим о некоей переменной типа TDateTime smile
И в общем то так и будет, если автор захочет узнать среднее количество отработанных часов в сутки.
А с какой точностью можно определить системное время это несколько иное. smile
ava
Beltar | 10.04.2013, 00:24 #
У полей типа время есть свойство Format, можно поэкспериментировать, возможно, что вроде 'HH:mm' будет выводить без отброса суток, ну и хелп почитать. В Excel такой формат вывода обозначался ЕМНИП как [ч]:мм. Хотя можно элементарно самому сделать велосипед. Например через костанты OneHour и OneMinute. Проще всего через минуты, Время/OneMinute, а потом div 60 и mod 60.
ava
northener | 10.04.2013, 00:41 #
Цитата (Beltar @  10.4.2013,  00:24 findReferencedText)
У полей типа время есть свойство Format, можно поэкспериментировать

Свойство Format влияет только на отображение строкового представления такого поля. Автору оно ничем не поможет. Все эти форматы даты/времени созданы для преобразования в строковое представление какого-то реального момента. Например "10.4.2013, 00:35". Но для показа временных интервалов они не подходят.
ava
Poseidon | 10.04.2013, 09:50 #
Цитата (ulmralex @  9.4.2013,  19:11 findReferencedText)
Результат должен по идее получится: 30:53
Откуда ты это взял? FormatDateTime с первым параметром 'HH:mm' все верно тебе выдал. Какие могут быть 30 часов? У нас 24-х часовой формат отображения времени. Результат у тебя: 1 день 6 часов 53 минуты. Отображаются только часы и минуты, т.е. 6 часов 53 минуты. Все верно.
ava
Beltar | 10.04.2013, 17:21 #
Так ему надо сложить часы (например, месячные трудозатраты, или что-то подобное), а не время вывести.
ava
Poseidon | 11.04.2013, 08:50 #
Тогда каким тут боком FormatDateTime? Для такого случая отлично работает пример kami. Можно еще применить вот такую функцию


uses System.DateUtils;
function MyTimeToString(DateTime: TDateTime): string;
var
  Mins: int64;
begin
  Mins:= MinutesBetween(0, DateTime);
  Result:= IntToStr(Mins div 60)+':'+IntToStr(Mins mod 60);
end;

ну и поменять 16ю строку кода автора на

  edit6.Text:=MyTimeToString(s);



ava
Beltar | 11.04.2013, 17:21 #
Ну так я то же самое, но через OneMinute рекомендовал, если формат не поможет. А про то какие там у этого формата возможности здесь вряд ли кто-то так сразу скажет. Я, когда его юзал, подбирал нужные значения чисто опытным путем.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit