Jak prawidłowo obliczyć sumę godzin?

0

Witam, piszę program w deplhi2010 z obsługą bazy PostgreSQL, stanąłem na formatce, na której chcę wyświeilić wyfiltrowane dane i sumy wierszy, problem polega, że suma kolumny paca_jazda (zmienna Date Time) zamiast prawidłowego wyniku 25:25 pokazuje 01:25, jakiej funkcji sumującej mogę użyć, lub jak prawidłowo zsumować wiersze w danej kolumny. Za pomoc z góry dziękuję

czas.jpg

1

jesteś pewien że to pole typu ftdateTime ? wg mnie jest typu ftTime, wskazuje na to format wyświetlania danych w gridzie, i dlatego 25 h i 25 min jest konwertowane na 1 h 25 min

1

przyjrzyj się czemuś co się nazywa TTimeSpan to powinno rozwiązać twój problem

1

Typy Tdate, TTime, TDateTime są tożsame z typem double gdzie część całkowita odpowiada za zapis dni, a ułamkowa godzin,minut,sekund,milisekund ... Czyli 2.00 to dwa dni, 2.50 - 2 dni 12 h .
Data jest zapisywana jako liczba dni licząc od 30.12.1899.
Stąd do obliczeń nieraz wygodniej jest traktować zmienne tych typów jako double.

np:

procedure TForm1.Button1Click(Sender: TObject);
var
  t: TDateTime;
begin
  t := 0.5;
  ShowMessage(DateTimeToStr(t));
end;
0

Dziiękję za wszelką pomoc, ale zbyt słaby jestem bym sobie sa poradził.Jak to zapisać w kodzie

0

@janusz.p27111960:
pokaż jak wyliczasz sumę

0
procedure TForm5.Dopisz1Click(Sender: TObject);
var
a: TdateTIME;
begin
zquery2.filter:='dd=1 and mm=6 and rr=2019';
zquery2.Filtered:=true;
zquery2.First;
while not ZQuery2.Eof do
  begin
  a:=a+zquery2.FieldByName('praca_jazda').asDateTime;
  zquery2.Next;
  end;

maskedit1.text:=Format('%d:%s',[HourOf(a),FormatDateTime('nn',a)]);
maskedit2.text:=timetostr(a);
0

Funkcje konwertujące zmienną typu TTime do stringa nie wyświetlą ci nigdy godziny "25:25" ponieważ nie ma godziny 25. Godzina 25:25 to inaczej 1:25 następnego dnia.

0
Uses System.TimeSpam;

procedure Tmain.Button1Click(Sender: TObject);
var
  Razem: TTimeSpan;
  czas1, czas2: TTime;
begin
  czas1 := Now; // 23:00:00
  czas2 := Now; // 23:00:00
  Razem := TTimeSpan.Parse(TimeToStr(czas1)) + TTimeSpan.Parse(TimeToStr(czas2));
  ShowMessage(Format('%d:%.2d:%.2d', [Razem.Days * 24 + Razem.Hours, Razem.Minutes, Razem.Seconds])); // 46:00:00
end;
0

Wszystko fajnie a jak to zapisać w pętli dla np 10 wieszy

0

piszę z pamięci:

with DataModule.qrypytanie, SQL do
  begin
    Clear;
    Close;
    Add('select kolumna_z _czasem from twoja_tabela');
    Open;
    First;
  end;

  while not DataModule.qrypytanie.Eof do
  begin
    Razem := Razem + TTimeSpan.Parse(TimeToStr(DataModule.qrypytanie.FieldByName('twoja_kolumna_z_czasem').AsTime));
    DataModule.qrypytanie.Next;
  end;
0

Niestety nie działa pokazuje mi wynik 0014

0

proszę o pomoc, co jest nie tak w tych obliczeniach (kodzie)

nit Unit5;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Mask, DBCtrls, DB, ZAbstractRODataset, ZAbstractDataset,
  ZDataset, ZAbstractConnection, ZConnection, Menus, Grids, DBGrids, DateUtils, TimeSpan,
  ADODB;

type
  TForm5 = class(TForm)
    DBGrid1: TDBGrid;
    MainMenu1: TMainMenu;
    Dopisz1: TMenuItem;
    Popraw1: TMenuItem;
    skasuj1: TMenuItem;
    Zakocz1: TMenuItem;
    ZConnection1: TZConnection;
    ZQuery2: TZQuery;
    DataSource2: TDataSource;
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    MaskEdit3: TMaskEdit;
    Label1: TLabel;
    ADOConnection1: TADOConnection;
    procedure Dopisz1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

{$R *.dfm}

procedure TForm5.Dopisz1Click(Sender: TObject);
var
a: TTime;
Razem: TTimeSpan;
begin
zquery2.filter:='dd=1 and mm=6 and rr=2019';
zquery2.Filtered:=true;
zquery2.First;
while not ZQuery2.Eof do
begin
    razem:=razem+TTimeSpan.Parse(timetostr(zquery2.fieldbyname('praca_jazda').asdatetime));
    zquery2.Next;
  end;
maskedit1.Text:=format('%.2d:%.2d:%.2d',[Razem.Days * 24 + Razem.Hours, Razem.Minutes, Razem.Seconds]); ;
end;

end.
0

ponownie zgłaszam się z problemem, moja aplikacja zbiera informację z kart pracy pracowników (baza postrgres, delphi 2010, komponenty zeos, po przetestowaniu wiem, że zapytanie
select sum(g_jazdy) from kartapracy where ....... działa prawidłowo (jak w załączniku

mam tylko problem jak je umieścić w kodzie i wynik zapisać w labelededit-cie

procedure TForm6.Button1Click(Sender: TObject);
begin
if labelededit4.text<>'' then
begin
  zquery1.Filter:='kierowca='+dblookupcombobox1.Text+' and dd1='+QuotedStr(labelededit4.text)+' and mm1='+QuotedStr(labelededit1.text)+' and rr1='+QuotedStr(labelededit2.text);
end;
if labelededit4.text='' then
begin
  zquery1.Filter:='kierowca='+dblookupcombobox1.Text+' and mm1='+QuotedStr(labelededit1.text)+' and rr1='+QuotedStr(labelededit2.text);
end;
zquery1.filtered:=true;


button2.Visible:=true
{
zquery1.First;
with zquery1, SQL do
  begin
    Close;
    Clear;
    ('select sum(godz_jazdy)';
    zqiery1.ExecSQL;
  end;
labelededit3.text:=timetostr(f1)
}

end;
0
labeledit.Text:=zquery1.Fields[1].AsString;

1 użytkowników online, w tym zalogowanych: 0, gości: 1