Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl (https://www.delphipraxis.net/80464-%5Bmssql2000%5D-smalldatetime-konv-ohne-datum-schlaegt-fehl.html)

Christian Seehase 9. Nov 2006 11:28

Datenbank: MS-SQL • Version: 2000 • Zugriff über: ADO

[MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Moin Zusammen,

in einer Spalte vom Typ smalldatetime möchte ich nur die Zeit speichern, da mich an der Stelle das Datum nicht weiter interessiert.
Die Zeit stammt aus TDateTimePicker.Time.
Um jetzt einen definierten Zustand für die Tabelle zu schaffen wollte ich, mit Hilfe von Frac nur den Zeitanteil wegschreiben, so dass also, z.B., 0,25 für 6:00 Morgens gespeichert wird.
Durch die 0 im Datumsanteil müsste dort also 01.01.1900 06:00:00 gespeichert werden.

Leider ist der SQL-Server da anderer Meinung, und wirft einen Fehler:

Zitat:

Zitat von Fehlermeldung
[Microsoft][ODBC SQL Server Driver][SQL Server]The conversion from datetime data type to smalldatetime data type resulted in a smalldatetime overflow error

Das ein datetime mit dem Wert 0,25 dem 01.01.1753 als Datum nicht in einen entsprechenden smalldatetime konvertiert werden kann, und somit zu diesem Fehler führt kann ich ja noch nachvollziehen, aber warum wird überhaupt der Umweg über datetime genommen, wenn das Ziel vom Typ smalldatetime ist? :gruebel:

Zugewiesen wird der Wert über TADODataSet.FieldValues[...], gespeichert dann per TADODataSet.Post.

Als Workaround addiere ich jetzt einfach das zur Zeit gehörige Datum mit auf, aber woher das Problem stammt wüsste ich doch ganz gerne.

Bernhard Geyer 9. Nov 2006 12:46

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Zitat:

Zitat von Christian Seehase
Zugewiesen wird der Wert über TADODataSet.FieldValues[...], gespeichert dann per TADODataSet.Post.

Bitte etwas mehr Code. vor allem welche AsXXX-Methode verwendet wird.
Generell ist es eigentlich immer mit weniger Probleme behaftet wenn man INSERT-Statement mit Parametern schreibt.

shmia 9. Nov 2006 13:26

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Code:
[b]smalldatetime[/b]
Datums- und Zeitangaben zwischen dem 1. Januar 1900 und dem 6. Juni 2079 mit einer Genauigkeit von einer Minute.
Wenn du nun beim Delphityp TDateTime das Datum wegschneidest (also zwischen 0.0 und 0.999999), dann bist du ganz knapp ausserhalb des für smalldatetime gültigen Bereichs.
Die Genauigkeit von einer Minute ist für viele Anwendungen zu wenig; ob das für dich ausreichend ist?

Christian Seehase 9. Nov 2006 15:36

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Moin Berhard,

ich verwende keine As-Methode, sondern direkt den Variant FieldValues.

Die Umstellung von Edit/Post auf UPDATE habe ich auch schon auf dem Zettel ;-)

Zitat:

Zitat von shmia
Wenn du nun beim Delphityp TDateTime das Datum wegschneidest (also zwischen 0.0 und 0.999999), dann bist du ganz knapp ausserhalb des für smalldatetime gültigen Bereichs.

Ja, aber auch nur, wenn der Wert in konvertierter Form übergeben wird. Wird der Wert erst serverseitig umgewandelt dürfte das nicht zu einem Fehler führen. Dort würde 0 nur anders interpretiert werden, so dass eben 01.01.1900 herauskommt, und nicht, wie in Delphi 30.12.1899.
Für mich sieht es, gemäss Fehlermeldung, so aus, als würde der Wert zweimal konvertiert werden, einmal in datetime (nicht TDateTime, sondern serverseitig), und dann in smalldatetime, und dann kracht es ;-)

Mir stellt sich halt nur die Frage, wodurch diese doppelte Konvertierung hervorgerufen wird.

Zitat:

Zitat von shmia
Die Genauigkeit von einer Minute ist für viele Anwendungen zu wenig; ob das für dich ausreichend ist?

da es sich hier um Reisedaten (Abfahrt,Ankunft) handelt, genügt die Genauigkeit.

Bernhard Geyer 9. Nov 2006 21:03

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Zitat:

Zitat von Christian Seehase
Mir stellt sich halt nur die Frage, wodurch diese doppelte Konvertierung hervorgerufen wird.

Schon mal den MS SQL Tracer angeschmissen?

Christian Seehase 9. Nov 2006 21:42

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Moin Bernhard,

meinst Du den Profiler?
Durch den muss ich mich dann erst mal durchbeissen ;-)

alzaimar 9. Nov 2006 21:55

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Hallo Christian,

Also ein direktes 'INSERT' funktioniert ohne Probleme.

Ich weiss aber, wo der Hund begraben liegt:
Delphi (oder ADO) wird deine Zeit in '31.12.1899 05:30' übersetzen. Klar, was anderes als TDateTime kennt Delphi ja auch nicht und 0,5 ist nun mal der '31.12.1899 12:00'. Dann wird das zum Server geschickt und der meckert dann.

Der Profiler ist übrigens ganz einfach.
1. Starten
2. Einloggen
3. Die Standardeinstellungen für ein Trace übernehmen
4. Erstmal den output anschauen
5. Oben sind ein paar Knöppe, Start,Stop, Pause (und noch ein paar mehr, egal jetzt)
6. Drück auf Stop, und spiel mit den Optionen rum. Interessant ist, WAS du anzeigen willst, WAS du protkollieren willst. Weiterhin kannst Du noch filtern, WER angezeigt werden soll.

Christian Seehase 9. Nov 2006 22:26

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Moin alzaimar,

danke.
Jetzt habe ich es hinbekommen.
Nun muss ich nur noch rauskriegen, was ich überwachen muss ;-)

Bernhard Geyer 9. Nov 2006 22:47

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Zitat:

Zitat von alzaimar
Delphi (oder ADO) wird deine Zeit in '31.12.1899 05:30' übersetzen. Klar, was anderes als TDateTime kennt Delphi ja auch nicht und 0,5 ist nun mal der '31.12.1899 12:00'. Dann wird das zum Server geschickt und der meckert dann

Und wieso diese Unterschiede? Delphi hat AFAIK mit TDatetime das Ole-Datumsformat übernommen.
Ist wohl MS nicht fähig sich auf den gleichen Startwert zu einigen. Hier sehe ich aber den 31.12.1899 00:00 eh etwas sehr ungewöhnlich an (auch wenns der von Delphi ist)

Christian Seehase 9. Nov 2006 22:50

Re: [MSSQL2000] Smalldatetime-Konv. ohne Datum schlägt fehl
 
Moin Zusammen,

bei Delphi ist der Startwert der 30.12.1899 00:00 (warum auch immer :gruebel:)

Morgen werde ich mich noch mal durch den ADO-Aufruf mit Debug-DCUs durcharbeiten, um mal zu sehen, an welcher Stelle denn nun die Konvertierung stattfindet.
Mit dem Tracen finde ich das nicht :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:53 Uhr.
Seite 1 von 2  1 2      

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