Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Konvertierungsfehler bei Funktion (https://www.delphipraxis.net/185420-konvertierungsfehler-bei-funktion.html)

khh 8. Jun 2015 15:58

Datenbank: Firebird • Version: 2.1 • Zugriff über: Zeos

Konvertierungsfehler bei Funktion
 
Hallo zusammen,
mit Auszug:
Delphi-Quellcode:
   FQuery1.SQL.add('sum (feld1 - feld1) as ergebnis');
  gesamtzeit := FQuery1.FieldByName('ergebnis').AsDateTime;
möchte ich das Ergebnis einer Subtraktion summieren.
Das funktionier m.E. auch, bis ich bei der Zuweisung an "gesamtzeit" einen error:
invalid Typconversion bekomme.
gesamtzeit ist vom Type TdateTime.

Was läuft falsch?

EDIT : sorry, klar Schreibfehler, muss feld1 - feld2 heissen

mkinzler 8. Jun 2015 16:11

AW: Konvertierungsfehler bei Funktion
 
ein TDateTime enthält einen Zeitpunkt ( als Uhrzeit). Subtrahiert man zwei Zeitwerte enzhält man eine Zeitspanne, Dies ist keine Zeitpunkt mehr. Erst recht wenn man diese Werte anschliessend addiert.
Welche Uhrzeit entspricht den z.B. 10 Min + 8 Min +5 Min?

p80286 8. Jun 2015 16:41

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von mkinzler (Beitrag 1304554)
Subtrahiert man zwei Zeitwerte enzhält man eine Zeitspanne, Dies ist keine Zeitpunkt mehr.

Woher weißt Du daß es sich um eine Zeitspannne handelt?
Ich bin automatisch davon Ausgegangen, das in Feld1,Feld2 Schreibfehler? ein Zeitpunkt seine Heimat gefunden hat.

Gruß
K-H

mkinzler 8. Jun 2015 17:38

AW: Konvertierungsfehler bei Funktion
 
Imho entsteht eine Zeitspanne wenn man 2 (Datum/)Zeitwerte von einander abzieht.
16 Uhr - 8 Uhr ergibt eine Zeitspanne von 8 Std. Nach Deiner Interpretation würde es ja einen Mittelwert also 12 Uhr ergeben. Aber auch dann wäre die Frage was dann welches Uhrzeit/Datum dann 5 * 12 Uhr ( wenn alle Werte einer Woche addiert werden) ergeben würde.

DeddyH 8. Jun 2015 17:41

AW: Konvertierungsfehler bei Funktion
 
Müsste bei
Zitat:

Delphi-Quellcode:
sum (feld1 - feld1)

nicht sowieso immer 0 herauskommen?

mkinzler 8. Jun 2015 17:43

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von DeddyH (Beitrag 1304576)
Müsste bei
Zitat:

Delphi-Quellcode:
sum (feld1 - feld1)

nicht sowieso immer 0 herauskommen?

Ich gehe mal davon aus, dass dies ein Tippfehler war.

khh 8. Jun 2015 17:57

AW: Konvertierungsfehler bei Funktion
 
ja, war ein Tippfehler,

das mit der Zeitspanne leuchtet mir ein.
Wenn ich die Abfrage direkt in der Datenbank absetzte bekomme ich einen Dezimalwert.

Heißt das ich muss als Datentyp einen Gleitkommatypen nehmen ?

mkinzler 8. Jun 2015 18:03

AW: Konvertierungsfehler bei Funktion
 
Ein TDateTime ist ja ein Double vor dem Komma steht das Datum, dahinter der Zeitanteil.
Das Problem dütfte die Interptretation des Wertes sein. Zeitspannen würde ich in einem Integer speichern ( Zeit in Millisekunden)

Dejan Vu 9. Jun 2015 07:01

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von mkinzler (Beitrag 1304579)
Ein TDateTime ist ja ein Double vor dem Komma steht das Datum, dahinter der Zeitanteil.

Vor dem Komma steht nicht das Datum, sondern die Anzahl der Tage seid dem 30.12.1899. Und nach dem Komma steht keine Uhrzeit, sondern die seit Mitternacht vergangene Zeit als Bruchteil eines Tages.

Ich würde den Wert in Delphi zunächst an einen Double zuweisen und den dann so formatieren, das man etwas damit anfangen kann. Die Einheit des Dezimalwertes wäre demnach 'Tage'. So würde der Wert '1.25' der Zeitspanne 'Ein Tag und 6 Stunden entsprechen'.

khh 9. Jun 2015 07:44

AW: Konvertierungsfehler bei Funktion
 
ich danke euch recht herzlich

khh 9. Jun 2015 08:23

AW: Konvertierungsfehler bei Funktion
 
alsoooo,
ich hab jetzt ein numerisches Ergebnis mit

0,083333333 was 2 Stunden entspricht

14:00 - 12:00

wie rechne ich jetzt am besten mit dem Tagesbruchteil weiter?
Einfach in Sekunden, Minuten, Stunden umrechnen ?

Da bekomme ich mit meinen 9 Nachkommastellen wohl Rundungsfehler rein :-(

Mikkey 9. Jun 2015 08:45

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von khh (Beitrag 1304622)
Da bekomme ich mit meinen 9 Nachkommastellen wohl Rundungsfehler rein :-(

Ein Punkt der 9. Stelle nach dem Komma entspricht 86 Nanosekunden. Wenn Du größere Genauigkeit brauchst...

himitsu 9. Jun 2015 08:46

AW: Konvertierungsfehler bei Funktion
 
siehe Delphi-Referenz durchsuchenDateUtils (Delphi) und SysUtils ... Lazarus k.A. wo.

Mit HoursPerDay oder MinsPerDay multiplizieren und Letzeres kann man auch als Integer rounden.

khh 9. Jun 2015 09:15

AW: Konvertierungsfehler bei Funktion
 
danke dir, gibt es bei Lazarus auch :-)

Popov 9. Jun 2015 09:29

AW: Konvertierungsfehler bei Funktion
 
Welchen Anteil haben Stunden, Minuten und Sekunden am Tagesanteil?

Die 1 steht für 1 Tag oder 24 Stunden. Deshalb berechnet man mit
Delphi-Quellcode:
h := 1 / 24;
...
eine Stunde;
Delphi-Quellcode:
h := 1 / 24 / 60;
...
eine Minute;
Delphi-Quellcode:
h := 1 / 24 / 60 / 60;
...
eine Sekunde;
Delphi-Quellcode:
h := 1 / 24 / 60 / 60 / 1000;
...
eine Millisekunde;

Wobei Delphi 1 Millisekunde mit Double gar nicht erfassen kann. Somit unterliegen die Millisekunden den Rundungsfehlern. Damit sollte man also nicht rechnen.

15 Minuten können somit so berechnet werden:
Delphi-Quellcode:
h := 1 / 24 / 60 * 15;
...
5 Stunden so:
Delphi-Quellcode:
h := 1 / 24 * 5;
...
300 Sekunden so:
Delphi-Quellcode:
h := 1 / 24 / 60 / 60 * 300;
...

Mikkey 9. Jun 2015 09:55

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von Popov (Beitrag 1304648)
Wobei Delphi 1 Millisekunde mit Double gar nicht erfassen kann. Somit unterliegen die Millisekunden den Rundungsfehlern.

Stop, das kann man so nicht stehen lassen.

Ein Double stellt mehr als 15 signifikante Dezimalstellen dar. Ein Datum im jetzigen Zeitalter hat 5 Stellen vor dem Komma, so bleiben für die Uhrzeit 10 signifikante Ziffern übrig. Im Bereich von etwa A.D. 1700 bis 2200 wird ein Zeitstempel also einer Auflösung von <10ns dargestellt.

Dies gilt natürlich nicht für die Uhr des Rechners und auch nicht für das Format, das die Datenbank für die Speicherung solcher Werte verwendet.

himitsu 9. Jun 2015 10:10

AW: Konvertierungsfehler bei Funktion
 
Delphi TDataTime/Double kann Millisekunden erfassen und zwar noch die nächsten paar hundert oder tausend Jahre lang.
Je größer der Datumsteil wird, mit steigendem Abstand von 30.12.1899, desto kleiner wird die Genauigkeit im Nachkommateil.

[edit] Ich sollte F5 benutzen.
15 bis 16 (15,7 oder so)

p80286 9. Jun 2015 11:10

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von khh (Beitrag 1304622)
wie rechne ich jetzt am besten mit dem Tagesbruchteil weiter?
Einfach in Sekunden, Minuten, Stunden umrechnen ?

wofür brauchst Du es denn? Wenn Du mit den Trainingszeiten eines Ferrari auf dem Hockenheimring umgehen mußt, dann ist die Millisekunde wohl durchaus relevant, geht es um die Bewegung Deiner Schildkröte im Salatbeet sollte die Sekunde durchaus reichen.
Nicht umsonst rechnen z.B. Autowerkstätten auch nicht minutengenau ab.

Gruß
K-H

Popov 9. Jun 2015 11:34

AW: Konvertierungsfehler bei Funktion
 
Aus Erfahrungen die ich mit eine Projekt gesammelt habe kann ich sagen: 1/10 Sekunde ist drin; bei 1/100 Sekunde wird es schon kritisch, sollte aber noch drin sein; 1/1000 ist problematisch. Weniger vom System, als wegen Double.

//Edit:

Auf der anderen Seite, wenn man den Tag auf Null setzt, also kein Vorkommastellen hat, könnte evtl. auch die 1/1000 Sekunde erfasst werden. Ich hab es aber noch nicht getestet. Ist nur eine Theorie.

BadenPower 9. Jun 2015 12:11

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von p80286 (Beitrag 1304663)
Nicht umsonst rechnen z.B. Autowerkstätten auch nicht minutengenau ab.

Zum Teil sogar genauer als 1 Minute.

VW:
1h = 100ZE (ZE = Zeiteinheiten)
heißt also
1ZE = 36 Sekunden.

khh 9. Jun 2015 12:12

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von p80286 (Beitrag 1304663)
wie rechne ich jetzt am besten mit dem Tagesbruchteil weiter?
Einfach in Sekunden, Minuten, Stunden umrechnen ?


wofür brauchst Du es denn?

Arbeitszeiterfassung, also die Sekunden sind nicht relevant ;-)

mkinzler 9. Jun 2015 12:14

AW: Konvertierungsfehler bei Funktion
 
Nennt man auch Industrieminute

Mikkey 9. Jun 2015 12:41

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von Popov (Beitrag 1304668)
Aus Erfahrungen die ich mit eine Projekt gesammelt habe kann ich sagen: 1/10 Sekunde ist drin; bei 1/100 Sekunde wird es schon kritisch, sollte aber noch drin sein; 1/1000 ist problematisch. Weniger vom System, als wegen Double.

//Edit:

Auf der anderen Seite, wenn man den Tag auf Null setzt, also kein Vorkommastellen hat, könnte evtl. auch die 1/1000 Sekunde erfasst werden. Ich hab es aber noch nicht getestet. Ist nur eine Theorie.

Du bist auf dem Holzweg:

Delphi-Quellcode:
var
  dt: TDateTime;
  add: double;
begin
  dt := Now();
  writeln(FormatDateTime('hh:nn:ss,zzz', dt));
  add := 1;
  while (dt < (dt + add)) do
    add := add / 10;
  add := add * 10;
  writeln(FormatDateTime('hh:nn:ss,zzz', dt+add));
  writeln(FloatToStr(add));
  readln;
end.
Ermittelt erst bei add=10E-12 gleiche Werte. 10E-11 Tage sind 864 Pikosekunden.

Ausgabe:
Code:
13:39:47,678
13:39:47,678
1E-11

p80286 9. Jun 2015 13:04

AW: Konvertierungsfehler bei Funktion
 
Zitat:

Zitat von BadenPower (Beitrag 1304674)
Zitat:

Zitat von p80286 (Beitrag 1304663)
Nicht umsonst rechnen z.B. Autowerkstätten auch nicht minutengenau ab.

Zum Teil sogar genauer als 1 Minute.

VW:
1h = 100ZE (ZE = Zeiteinheiten)
heißt also
1ZE = 36 Sekunden.

Berichtige mich, aber werden nicht immer mind. 5 Einheiten berechnet?
(Unsere "Stempeluhr" hat auch 100Minuten, ihr Intervall ist aber 5 (=3 echte Minuten))

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz