AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken 0.0 ist kein gültiger Zeitstempel
Thema durchsuchen
Ansicht
Themen-Optionen

0.0 ist kein gültiger Zeitstempel

Ein Thema von Angel4585 · begonnen am 2. Aug 2011 · letzter Beitrag vom 11. Aug 2011
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

0.0 ist kein gültiger Zeitstempel

  Alt 2. Aug 2011, 15:13
Datenbank: BDE • Version: 5.2.xyz • Zugriff über: Delphi Std DB Komponenten
Ich hab ne leere Tabelle mit ein paar Feldern. Eins davon ein Datumsfeld(Nicht DateTime, sondern Date)
Da ich jetz nix besseres gefunden hab, sprich ich das Feld über .AsDateTime an um den Wert auf Now zu setzen.
Dummerweise hab ich jetz als Datum den 15.8.11572 drin und bekomm beim Auslesen als Datetime eben die Meldung 0.0 ist kein gültiger Zeitstempel.
Wenn ich das Feld auf DateTime setze geht es.

Was für Werte erwartet denn so ein Date-Feld?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.545 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 2. Aug 2011, 15:18
Welche DB ist das denn? Paradox?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.889 Beiträge
 
Delphi 12 Athens
 
#3

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 2. Aug 2011, 17:40
Ich hab ne leere Tabelle mit ein paar Feldern. Eins davon ein Datumsfeld(Nicht DateTime, sondern Date)
Da ich jetz nix besseres gefunden hab, sprich ich das Feld über .AsDateTime an um den Wert auf Now zu setzen.
Dummerweise hab ich jetz als Datum den 15.8.11572 drin und bekomm beim Auslesen als Datetime eben die Meldung 0.0 ist kein gültiger Zeitstempel.
Wenn ich das Feld auf DateTime setze geht es.

Was für Werte erwartet denn so ein Date-Feld?
Wir haben wegen dieser problem immer nur datetime felder in der BDE benutzt.
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 2. Aug 2011, 19:28
Ja genau Paradox, ich werds auch auf Datetime umstellen aber interessieren würds mich schon.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
FredlFesl

Registriert seit: 19. Apr 2011
293 Beiträge
 
Delphi 2009 Enterprise
 
#5

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 3. Aug 2011, 04:59
Ich hab bisher immer Probleme mit 'Date' gehabt, egal mit welcher DB ich gearbeitet habe. Inzwischen denke ich gar nicht mehr daran, 'Date' zu verwenden.

Inzwischen fühlt sich mein Haar viel kräftiger an.
Das Bild hängt schief.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 3. Aug 2011, 06:25
Na ja, unter Delphi ist ein DateTime Wert ein Fließkommawert. Der ganzzahlige Anteil repräsentiert den Tag und der Nachkommaanteil den Bruchteil eines Tages, also die Zeit. Da der Datentyp Date keine Zeitangabe besitzt, wird er, vermute ich mal, nicht durch eine Fließkommazahl repräsentiert, sondern durch einen Integer. Und damit wäre eine Fließkommazahl kein gültiger Date Wert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#7

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 3. Aug 2011, 06:38
Verstehe. Und beschreiben klappt weil am Anfang 0 drinsteht was auch als DateTime interpretiert werden kann.
Dann schreibt man ne Fliesskommazahl rein die die Bits weis Gott wie belegt.
Diese Anordnung von Bits wird ab dann beim Auslesen als Integer interpretiert und ergibt so ein Datum.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: 0.0 ist kein gültiger Zeitstempel

  Alt 10. Aug 2011, 23:31
Da der Datentyp Date keine Zeitangabe besitzt, wird er, vermute ich mal, nicht durch eine Fließkommazahl repräsentiert, sondern durch einen Integer. Und damit wäre eine Fließkommazahl kein gültiger Date Wert.

Das Thema ist nicht mehr ganz taufrisch, bedarf aber doch deutlicher Korrektur:

Zunächst einiges Grundsätzliche:
Zwar wird der Wert für Date() tatsächlich intern (innerhalb der Funktion TryEncodeDate()) aus der Summe ausschließlich reiner Integerwerte berechnet, er wird aber dennoch eindeutig als Typ TDateTime abgelegt und ist somit de facto vom Typ Double.

So zeigt auch der Code
Code:
showmessage(format('Ausgabewert Date() belegt %d Bytes',[sizeof(date())]));
an, dass der von Date() zurückgegebene Wert tatsächlich 8 Bytes belegt (zur Erinnerung: Integervariablen belegen 4 Bytes)

Von den 8 Bytes einer TDateTime-Variablen werden 4 Bytes für den exponentiellen Anteil, also die Tageszeit verwendet und 4 Bytes für die Mantisse, also das aktuelle Tagedatum, gemäß dem detaillierten Format des Zeitstempels:
Bit Inhalt
-------------------
00-04 Sekunde
05-10 Minute
11-15 Stunde
16-20 Tag
21-24 Monat
25-31 Jahr

Bei Date() werden die Nachkommastellen, welche in TDateTime die Tageszeit definieren, grundsätzlich immer mit 0 belegt.
Dagegen werden bei Time() die Vorkommastellen grundsätzlich immer mit der Bytefolge belegt, die dem Datum 30.12.1899 entspricht, also auf das Datum bezogen ist, welches Delphi seit Delphi 2 als Referenzwert seiner TDateTimezählung verwendet (dies aus Gründen der Kompatibilität zu der zuvor von MS eingeführten OLE 2.0 Automation).

Dementsprechend wirft der Code
Code:
showmessage(format('Date() = %d',[date()]));
die EConvertError-Exception "Format '%d' ungültig oder nicht kompatibel mit Argument",
wogegen der Code
Code:
showmessage(format('Date() = %f',[date()]));
ganz normal ausgibt (am 10.08.2011): "Date() = 40765,00"


Das von Angel4585 beschriebene Problem entsteht nun vielmehr durch einen Bug in der Funktionskette StrToDate() -> TryStrToDate() -> ScanDate() -> ScanNumber(): In ScanNumber() wird die Stringlänge der eingebenen Jahreszahl auf maximal 4 Zeichen gekürzt, sodass eben von der tatsächlich eingegebenen Jahreszahl 11572 nur die gekürzte Jahreszahl 1157 übrigbleibt. Diese aber liegt unterhalb der Referenzjahreszahl 1899 (Wert = 0), wodurch die in TryEncodeDate(Y, M, D, Date) berechnete Date-Variable negativ wird und dadurch letztendlich die beschriebene EConvertError-Exception ausgelöst wird.

Von diesem Problem sind alle Funktionen betroffen, die einen Datumstring in eine TDateTime- bzw. TDate-Variable konvertieren (wie StrToDateTime() und StrToDate()): diese sind also nur für Jahreszahlen bis 9999 einsetzbar!

Interessanterweise ist dem gegenüber als maximaler TDate-Wert 2146790053 erlaubt, was dem Datum 11.Juli 46907 (!) entspricht. Die Konversion eines solch hohen TDate-Wertes in eine Stringvariable ist also von dem o.g. Problem nicht betroffen (obwohl auch hierbei der eigentliche Maxint von 2147483647 nicht erreicht werden kann, allerdings dann keine Exception ausgelöst wird, sondern das Datum oberhalb eines TDate von 2146790053 nur rigoros und ohne Warnung auf 00.00.0000 gesetzt wird).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:18 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