Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   TDateTime und Timestamp (https://www.delphipraxis.net/201350-tdatetime-und-timestamp.html)

Trafel21 15. Jul 2019 08:43

Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE

TDateTime und Timestamp
 
Hallo zusammen,

ich hab in Delphi eine Variablentyp TDateTime dessen Wert ich in eine Timestamp Datenfeld in Firebird übergeben möchte.

Momentan sieht es bei mir so aus:

Code:
today: TDateTime;

IB_PhoneCallCALLTIME_START.AsString := DateTimeToStr(today);
Es wird nur kein Wert übermittelt. Weiß jemand evtl woran es liegt?

Codehunter 15. Jul 2019 08:49

AW: TDateTime und Timestamp
 
Mit .AsDateTime?

dataspider 15. Jul 2019 08:53

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Trafel21 (Beitrag 1436739)
Code:
today: TDateTime;

Ist das eine Variable? Dann überschreibst / versteckst du die Function Today aus DateUtils...

Wenn Feld DateTime, warum dann 2 Mal die Umwandlung in string?
Code:
DateTimeField.Value := Today:
reicht, wenn aktuelles Datum gewünscht...

oder
Code:
Var
  LDatum: TDateTime;
...
DateTimeField.Value := LDatum:
... wenn irgendein Datum...


oder das Feld gleich als default current_date definieren...

Frank

Trafel21 15. Jul 2019 08:54

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Codehunter (Beitrag 1436740)
Mit .AsDateTime?

... hab ich wirklich nicht gefunden. Schusselkeitsfehler... danke.

Trafel21 15. Jul 2019 08:58

AW: TDateTime und Timestamp
 
Zitat:

Zitat von dataspider (Beitrag 1436741)
Zitat:

Zitat von Trafel21 (Beitrag 1436739)
Code:
today: TDateTime;

Ist das eine Variable? Dann überschreibst / versteckst du die Function Today aus DateUtils...

Wenn Feld DateTime, warum dann 2 Mal die Umwandlung in string?
Code:
DateTimeField.Value := Today:
reicht...

oder das Feld gleich als default current_daten definieren...

Frank

Vielen Dank! :)

Codehunter 15. Jul 2019 09:00

AW: TDateTime und Timestamp
 
Zitat:

Zitat von dataspider (Beitrag 1436741)
Code:
DateTimeField.Value := Today:

Das sehe ich in letzter Zeit öfters hier. Den Umweg über Variant finde ich aber auch nicht wirklich prickelnd. Wenn man den Datentyp kennt sollte man IMHO so ansprechen. Der Compiler ist nicht unfehlbar was die automatische Erkennung angeht.

Delphi.Narium 15. Jul 2019 09:11

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Codehunter (Beitrag 1436745)
Zitat:

Zitat von dataspider (Beitrag 1436741)
Code:
DateTimeField.Value := Today:

Das sehe ich in letzter Zeit öfters hier. Den Umweg über Variant finde ich aber auch nicht wirklich prickelnd. Wenn man den Datentyp kennt sollte man IMHO so ansprechen. Der Compiler ist nicht unfehlbar was die automatische Erkennung angeht.

Macht das denn schon der Compiler?

Dachte immer das Vairant zur Laufzeit "irgendwie interpretiert wird" (und wenn man Glück hat, kommt das Richtige dabei raus ;-) - meistens ;-))

Variant nutze ich nur, wenn ich mich auf die Interpretation verlassen muss, z. B. bei OleObjekten.

Weiß ich, um was für einen Typ es sich handelt, dann nutze ich den auch. Also: .AsString, .AsInteger, .AsDateTime ... Hat den Vorteil, dass auch die Typsicherheit gewahrt bleibt.

p80286 15. Jul 2019 09:18

AW: TDateTime und Timestamp
 
Eigentlich kennt jede DB "today" das muß nicht von aussen kommen.
Vor allem Bei DB die über mehrere Standorte weltweit verteilt snd ist das vorteilhaft.

Gruß
K-H

Uwe Raabe 15. Jul 2019 10:11

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Codehunter (Beitrag 1436745)
Zitat:

Zitat von dataspider (Beitrag 1436741)
Code:
DateTimeField.Value := Today:

Das sehe ich in letzter Zeit öfters hier. Den Umweg über Variant finde ich aber auch nicht wirklich prickelnd. Wenn man den Datentyp kennt sollte man IMHO so ansprechen. Der Compiler ist nicht unfehlbar was die automatische Erkennung angeht.

Wenn DateTimeField ein
Delphi-Quellcode:
TDateTimeField
ist, dann ist das Property
Delphi-Quellcode:
Value
kein
Delphi-Quellcode:
Variant
, sondern ein
Delphi-Quellcode:
TDateTime
. Nur bei einem
Delphi-Quellcode:
TField
ist Value ein
Delphi-Quellcode:
Variant
.

Codehunter 15. Jul 2019 10:22

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1436754)
Wenn DateTimeField ein
Delphi-Quellcode:
TDateTimeField
ist, dann ist das Property
Delphi-Quellcode:
Value
kein
Delphi-Quellcode:
Variant
, sondern ein
Delphi-Quellcode:
TDateTime
. Nur bei einem
Delphi-Quellcode:
TField
ist Value ein
Delphi-Quellcode:
Variant
.

Lach ok, war mir neu. Aber auch irgendwie verwirrend. Ich arbeite nicht mit dem grafischen Feldeditor sondern i.d.R. mit FieldByName oder Fields[0]. Daher habe ich auch in den allermeisten Fällen kein TIrgendeinTypField sondern eben nur ein simples TField. Und dort ist .Value eben ein Variant ^^

dataspider 15. Jul 2019 11:45

AW: TDateTime und Timestamp
 
Ich sehe in der Ausgangsfrage einige "Ungereimtheiten".

Wenn das Feld wirklich ein TimeStamp ist, dann wäre die Zuweisung Now anstatt Today logischer.
Es scheint auch, als ob es besser wäre, das Feld in der DB als "default current_timestamp" anzulegen.

Aber um das richtig zu bewerten reichen die Info' s nicht.

Die Frage mit Value oder As... kann man auch nicht pauschal beantworten.
Ich sehe es als Vorliebe von mir, habe aber auch meine Gründe.
So erzeugt z.B. ein FeldOderParamter.AsString := '' (ja nach Komponenten) in der DB einen Leerstring anstatt null, was ich so nicht möchte.
Ich habe halt auch viel mit Automatismen (Import, Export, Workflows etc.) zu schaffen, wo ich den Typ nicht unbedingt kenne.
Und Value funktioniert bis jetzt mit den von mir verwendeten Komponenten immer korrekt.
Auch kann in der DB den Feldtyp einfach mal ändern, ohne über Anpassungen im Code nachzudenken.

Frank Reim

Codehunter 15. Jul 2019 11:56

AW: TDateTime und Timestamp
 
Zitat:

Zitat von dataspider (Beitrag 1436763)
So erzeugt z.B. ein FeldOderParamter.AsString := '' (ja nach Komponenten) in der DB einen Leerstring anstatt null, was ich so nicht möchte.

Was IMHO ein völlig korrektes Verhalten ist. Möchte man ein NULL, sollte man explizit TField.Clear verwenden. Bedenke, es kann ja z.B. ein VARCHAR() NOT NULL Feld sein, wo man dennoch einen Leerstring zuweisen könnte. Oftmals ist das bei den neueren Edeldödel-Konnektoren so gelöst, dass man besagtes Verhalten durch irgendwelche Connection-Parameter beeinflussen kann.

dataspider 15. Jul 2019 12:24

AW: TDateTime und Timestamp
 
Zitat:

Zitat von Codehunter (Beitrag 1436765)
Was IMHO ein völlig korrektes Verhalten ist. Möchte man ein NULL, sollte man explizit TField.Clear verwenden. Bedenke, es kann ja z.B. ein VARCHAR() NOT NULL Feld sein, wo man dennoch einen Leerstring zuweisen könnte. Oftmals ist das bei den neueren Edeldödel-Konnektoren so gelöst, dass man besagtes Verhalten durch irgendwelche Connection-Parameter beeinflussen kann.

Damit hast du völlig recht.

Aber wenn ich in der DB in leeren VARCHAR - Feldern Null anstatt '' haben will, geht das halt nur mit Variants und Value.
Auch wenn es Komponenten gibt, wo ich über z.B. BlankAsNull oder wie immer das benannt ist das Verhalten steuern kann...

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:49 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