![]() |
MSSQL Stored Procedure -> datetime vergleichsprobleme???
hi
ich schreibe ein delphiprogramm das folgende storedprocedure verwendet:
SQL-Code:
das Problem liegt in dieser Zeile (in der ersten WHERE Klausel):
ALTER PROCEDURE [dbo].[p_bb_ignore_folder]
@username varchar(30), @ignore_dir varchar(255), @date_time datetime AS DECLARE @size bigint, @id_user int SET @size = -1; SET @id_user = (SELECT [t_bb_user].[id_user] FROM [t_bb_user] WHERE [t_bb_user].[username] = @username); SET @size = ( SELECT SUM([t_bb_folder_info].[folder_size]) FROM [t_bb_folder_info] WHERE ( ([t_bb_folder_info].[folder] LIKE @ignore_dir+'%') AND ([t_bb_folder_info].[id_user] = @id_user) AND ([t_bb_folder_info].[date_time] = @date_time) ) ); UPDATE t_bb_logon SET [t_bb_logon].[ignore_dir_size] = @size WHERE ( ([t_bb_logon].[id_user] = @id_user) /*AND ([t_bb_logon].[date_time] = @date_time)*/ );
SQL-Code:
also obwohl in der tabelle mehrere Einträge vorhanden sind die dieser Bedinung entspechen, meint sql das es eben nicht so ist...
AND ([t_bb_folder_info].[date_time] = @date_time)
lasse ich die Zeile weg oder kommentiere ich sie aus, passiert was passieren soll.. kann ich das:
SQL-Code:
grundsätzlich nicht so machen?
AND ([t_bb_folder_info].[date_time] = @date_time)
ich will die bedingung , dass nur die "folder_size" zusammengezählt werden, die im feld "date_time" = "@date_time" haben... is schwierig zu erklären, kommt ihr da mit, oder hab ich nur stuss erzählt? wäre um jede Hilfe froh, bin schon seit drei Tagen an dieser Procedure und kreigs einfach nicht hin... Danke schon mal... |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Du hast eventuell nicht berücksichtig, dass ein Datetime auf Stunden, Minuten, Sekunden und Millisekundenanteile hat... Ich denke, da solltest du dein Problem eventuell finden.
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
? ne, is alles genau gleich, scheint jedenfalls so..
SQL-Code:
oder nicht?
2008-05-07 16:12:52.000 = 2008-05-07 16:12:52.000
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Der Datetime Datentyp des SQL Server hat eine Genauigkeit von einer 3/100 Sekunden.
Der Delphi Datentyp hat eine höhere Genauigkeit; auf jeden Fall können Rundungsfehler bei der Umrechnung auftreten. Also darf man eigentlich den Datentyp Datetime nicht auf Gleichheit überprüfen !! Du könntest nun einen Trick anwenden und deine Zeitwerte vorher runden:
Delphi-Quellcode:
Also anstatt den Wert von Now() direkt zu verwenden, einmal durch obige Funktion jagen und in eine TDateTime Variablen speichern. Dann nur mit diesem Wert arbeiten, denn Now() läuft ja weiter...
function RoundedDateTime(value:TDateTime):TDateTime;
begin result := Round(value * 32768) / 32768; end; |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
hmm klingt eigentlich logisch aber:
1. im code nehme ich die zeit Now; nur einmal, speichere es in eine variable und arbeite dann mit dieser weiter. schreibe meine Einträge in die Datenbank und wende die Proc "p_bb_ignore_folder" an währen dieses ganzen Ablaufs verwende ich immer die selbe Variable. 2. für den Test der Funktion habe ich die Procedure direkt vom MSSQL Server Management Studio ausgeführt und kopiere den exakten Wert aus der Tabelle womit die Ungenauigkeit eigentlich auch verhindert werden sollte... aber wahrscheinlich haste trotzdem irgendwie recht, denn ersetze ich
SQL-Code:
mit
AND ([t_bb_folder_info].[date_time] = @date_time)
SQL-Code:
passiert ja was... also scheinen die dati trotzdem nicht überein zu stimmen. aber wo ist der Fehler?
AND ([t_bb_folder_info].[date_time] <> @date_time)
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hallo Cherry,
leider kann ich Dir nichts genaues sagen, aber ich verute das Du zwar nicht Äpfel mit Birnen aber Boskop mit Granny Smith vergleichst. Soweit ich weiß gibt es mindestens zwei unterschiedliche "Zeit-Typen" Datum und Timestamp und die beiden sind nicht kompatibel. Wenn Du also vergleichst, dann nur über ein "Zwischenformat" wie z.B.
SQL-Code:
Hier bist Du Herr des Geschehens weil Du beide Seiten des Vergleichs definiert hast.
to_char(trunc(sysdate),'YYYYMMDD')=to_char(trunc(startdat),'YYYYMMDD')
Gruß K-H |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
Zitat:
Ich würde mit datediff(...) arbeiten:
SQL-Code:
where datediff( ss, date_time, @date_time ) < 1
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Pardon da hab ich mich vergallopiert,
aber das Prinzip ist das gleiche. ( ist schon toll wie kompatibel die SQL-Dialekte sind) Gruß K-H |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
Zitat:
Hier wird eine Sekundendifferenz gebildet. Wenn der TE mehrere Datensätze für einen Tag hat, aber nur die mit an diesem Tag mit der gewünschten Zeit ansprechen möchte, dann greift dein Vergleich auf falsche Daten zu. |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Die Funktion 'DateDiff' wird den Einsatz eines Index verhindern. Ich verwende bei DateTime-Vergleichen immer 'BETWEEN', hier wäre das z.B.
SQL-Code:
Wobei 'dbo.DateOnly' eine UDF ist, die den Datumsanteil eine DateTime-Wertes liefert.
WHERE Table.DateTimeField Between DateAdd(minute,-1,@Date) and DateAdd (minute,1,@Date)
AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
SQL-Code:
Die Werte der BETWEEN-Klausel werden vom Optimizer in Konstanten (ggü der Tabelle) übersetzt und damit kann der Index greifen. Bei Datediff geht das nicht, weil ja jedesmal die Differenz gebildet werden muss.
CREATE FUNCTION [dbo].[DateOnly] (@Date DateTime)
RETURNS Datetime AS BEGIN Return cast (floor (cast (@Date as float)) as DateTime) END |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
Aber der Minutenbereich ist doch eigendlich zu groß?
SQL-Code:
Damit wird doch nicht nur die gewünschte Zeit, sondern auch 1 Minute vorher/nachher zurückgeliefert, oder?
WHERE Table.DateTimeField Between DateAdd(minute,-1,@Date) and DateAdd (minute,1,@Date)
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Dann nimm halt ne Sekunde ('second') oder 'millisecond'.
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
1.) reicht das nicht schon alleine?
SQL-Code:
2.) wozu ist denn das hier jetzt genau?!:
WHERE Table.DateTimeField Between DateAdd(second,-1,@Date) and DateAdd (second,1,@Date)
SQL-Code:
3.) und was die Funktion DateOnly genau aus meinem Datum macht erkenn ich auch nicht so auf den ersten Blick?!
AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
aber vielen Dank schon mal für die vielversprechenden Antworten //EDIT sehe ich das richtig: dieses hier:
SQL-Code:
vergleicht nur die sekunden, nicht aber das Datum und die Zeit auf sekunden genauigkeit?
WHERE Table.DateTimeField Between DateAdd(second,-1,@Date) and DateAdd (second,1,@Date)
deshalb muss ich mit
SQL-Code:
noch das Datum vergleichen?
AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
trotzdem was macht die Funktion DateOnly genau? |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
Zitat:
Vorkomma- und die Zeit im Nachkommateil abgebildet sind. Die DateOnly-Funktion macht nichts anderes, als den Nachkommateil abzuschneiden. |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
achso, dann kapier ich jetz DateOnly ;-)
aber: hab mal kurz einen neuen Versuch gestartet und in der WHERE Klausel steht jetzt nur noch folgendes: weder so...
SQL-Code:
noch so...
[t_bb_folder_info].[date_time] Between DateAdd(hour,-1,@date_time) and DateAdd(hour,1,@date_time)
SQL-Code:
... findet sql die gewünschten datensätze mein SELECT SUM() gibt also NULL resp. 0 zurück ;-(
DateAdd(hour,0,[t_bb_folder_info].[date_time]) Between DateAdd(hour,-1,@date_time) and DateAdd(hour,1,@date_time)
ich mach wohl noch was anderes falsch, aber was denn? |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
um zu sehen, mit welchen Werten gearbeitet wird, lass dir die Daten doch mal anzeigen:
SQL-Code:
Das hier übrigends...
select DateAdd(hour,-1,@date_time), DateAdd(hour,1,@date_time), [t_bb_folder_info].[date_time] ...
SQL-Code:
hat wieder das Problem mit dem Index, da die Tabellenspalte in einer Funktion "verpackt" ist
where DateAdd(hour,0,[t_bb_folder_info].[date_time]) Between ...
und somit kein Index verwendet werden kann. |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
wie wärs dann damit?
SQL-Code:
geht bei mir aber leider auch net...
CAST([t_bb_folder_info].[date_time] AS CHAR(25)) = CAST(@date_time AS CHAR(25))
ich hab so langsam aber sicher das Gefühl, dass bei mir etwas ganz faul ist... denn wenn ich ein select auf mein gespeichertes datum mache sieht das so aus:
SQL-Code:
wenn ich nun meine procedure ausführe und als @date_time parameter ebenfalls
2008-05-07 15:16:32.000
SQL-Code:
mitgebe funktioniert ja das alles nicht mit keiner bisher getesteten variante...
2008-05-07 15:16:32.000
Zitat:
SQL-Code:
???
CAST("2008-05-07 15:16:32.000" AS datetime);
//EDIT Zitat:
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
ausgabe:
SQL-Code:
usw
2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000
2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
lass doch erstmal alles Andere weg und bau dir eine Select-Anweisung zusammen, die das Gewünschte liefert. Dazu nimmst du das SQl-Query-Tool oder die Management-Console von MS. Wenn das Select dann funktioniert, gehts in Delphi weiter... Wenn´s dann immer noch nich klappt, poste mal eine paar Beispieldaten samt deinem kompetten Select. :wink: Zitat:
Bedingung richtig fornuliert ist. |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
SQL-Code:
gibt mir keinen einzigen datensatz zurück...
declare
@date_time datetime SET @date_time = CAST('2008-05-07 15:16:32.000' AS datetime); SELECT folder_size FROM [t_bb_folder_info] where [t_bb_folder_info].[date_time] Between DateAdd(hour,-1,@date_time) and DateAdd(hour,1,@date_time) obwohl
SQL-Code:
folgendes zurück gibt:
declare
@date_time datetime SET @date_time = CAST('2008-05-07 15:16:32.000' AS datetime); SELECT DateAdd(hour,-1,@date_time), DateAdd(hour,1,@date_time), [t_bb_folder_info].[date_time] FROM [t_bb_folder_info]
SQL-Code:
2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000
2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 2008-07-05 14:16:32.000 ¦ 2008-07-05 16:16:32.000 ¦ 2008-05-07 15:16:32.000 . . . |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
SQL-Code:
getippt und nicht getestet
declare @Date_Time datetime
set @Date_Time = '2008-05-07 15:16:32' select * from [t_bb_folder_info] where [t_bb_folder_info].[date_time] between DateAdd(second, -1, @Date_Time) and DateAdd(second, 1, @DateTime) |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Also jetzt seh ichs auch aber Hallo, da stimmt doch definitiv etwas nicht?! *hirnschleiff*
SQL-Code:
erzeugt folgende ausgabe
declare
@date_time datetime SET @date_time = CAST('2008-07-05 15:16:32.000' AS datetime); SELECT * FROM [t_bb_folder_info] where [t_bb_folder_info].[date_time] Between DateAdd(second,-1,@date_time) and DateAdd(second,1,@date_time)
SQL-Code:
also oben beim Select gebe ich dieses datetime mit: '2008-07-05 15:16:32.000' dann findet es dieses datetime '2008-05-07 15:16:32.000'
172743 ¦ C:\Dokumente und Einstellungen\th21498\ ¦ 8789271 ¦ 2008-05-07 15:16:32.000 ¦ 12
172744 ¦ C:\Dokumente und Einstellungen\th21498\borland ¦ 5117 ¦ 2008-05-07 15:16:32.000 ¦ 12 172745 ¦ C:\Dokumente und Einstellungen\th21498\.revj0079 ¦ 4542 ¦ 2008-05-07 15:16:32.000 ¦ 12 172746 ¦ C:\Dokumente und Einstellungen\th21498\.SunDown... ¦ 97451 ¦ 2008-05-07 15:16:32.000 ¦ 12 . . . spinn ich jetzt??????????????????????? :wall: |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
das liegt dann an deinem eingestellen Datumformat des SQl-Servers. Nimm mal das
SQL-Code:
[edit]
set dateformat ymd
declare @Date_Time datetime set @Date_Time = '2008-05-07 15:16:32' select * from [t_bb_folder_info] where [t_bb_folder_info].[date_time] between DateAdd(second, -1, @Date_Time) and DateAdd(second, 1, @DateTime) unabhängig vom eingstellten Datumformat ist folgendes set @Date_Time = '20080507 15:16:32.000' [/edit] |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
hmmm...
SQL-Code:
es ist ein produktiver MSSQL Server auf dem sehr wichtige "Programme" laufen ich schätze das kann ich mir nicht erlauben sonst werd ich noch gesteinigt :lol:
set dateformat ymd
kann ich das Problem nicht anders lösen? |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
und heisst das mein Programm würde dann nicht mehr so richtig funktionieren wenn der SQL -Server ein anderes Datumsformat hätte? |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
Zitat:
Zitat:
Vom Programm werden (hoffendlich) direkt Datetime-Werte geliefert. Zitat:
dann ist es eben unabhängig von den Server-Einstellungen. |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
also bitte nochmals für all diejenigen, die einen IQ < 100 haben :lol:
Zitat:
als Parameter wird aber bereits ein datetime Wert geliefert wie du das ja hoffst, also wo passiert dann das Umwandeln von String in Datetime... am schluss habe ich ja nirgens mehr ein String Wert.. eine solche Umwandlung wird es nie geben... :wiejetzt: |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
SQL-Code:
Wenn dein Select dann das gewünschte Ergebnis liefert, baust du das
declare @Date_Time datetime
set @Date_Time = '20080507 15:16:32.000' select ... in eine Procedure und prüft diese nochmal per Aufruf aus dem Query-Tool (hierbei wieder das Datumformat beachten). Geht das auch, dann weiter in Delphi... |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
ok... ich meld mich dann wieder wenn ich soweit bin...
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
ok also SELECT funktionierte... meine StoredProc scheint es auch zu tun... so sieht sie nun aus:
SQL-Code:
mit dem aufruf direkt vom Server funktioniert das so:
ALTER PROCEDURE [dbo].[p_bb_ignore_folder]
@username varchar(30), @ignore_dir varchar(255), @date_time datetime AS DECLARE @size bigint, @id_user int SET @size = -1; SET @id_user = (SELECT [t_bb_user].[id_user] FROM [t_bb_user] WHERE [t_bb_user].[username] = @username); SET @size = ( SELECT SUM([t_bb_folder_info].[folder_size]) FROM [t_bb_folder_info] WHERE ( [t_bb_folder_info].[id_user] = @id_user AND [t_bb_folder_info].[folder] LIKE @ignore_dir AND dbo.DateOnly([t_bb_folder_info].[date_time]) = dbo.DateOnly(@Date_Time) AND [t_bb_folder_info].[date_time] BETWEEN DateAdd(millisecond, -1, @Date_Time) and DateAdd(millisecond, 1, @Date_Time) ) ); UPDATE t_bb_logon SET [t_bb_logon].[ignore_dir_size] = @size WHERE ( [t_bb_logon].[id_user] = @id_user AND dbo.DateOnly([t_bb_logon].[date_time]) = dbo.DateOnly(@Date_Time) AND [t_bb_logon].[date_time] BETWEEN DateAdd(millisecond, -1, @Date_Time) and DateAdd(millisecond, 1, @Date_Time) ); RETURN @size
SQL-Code:
alles palleti...
declare
@result bigint EXEC @result = p_bb_ignore_folder 'th21498', 'C:\Dokumente und Einstellungen\th21498\Lokale Einstellungen\%', '20080507 15:16:32.000' print CAST(@result AS CHAR(255)); wie befürchtet funktioniert der Aufruf aus meiner Delphi-Applikation leider nicht. Meine Vermutung -> eben das angesprochene ydm <-> ymd Problem... meint Aufruf in Delphi:
Delphi-Quellcode:
wie stelle ich das nun an...
procedure TSisterWatch.IgnoreDir(Date_Time: TDateTime);
var tmp_igp: String; begin tmp_igp := GetIgnoreDir; if tmp_igp <> '' then begin with ADOStoredProc8 do begin Parameters.ParamValues['@username'] := Username; Parameters.ParamValues['@ignore_dir'] := tmp_igp; Parameters.ParamValues['@date_time'] := Date_Time; ExecProc; end; end; end; |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
hab´ heute nur wenig Zeit wie wird denn die AdoStoredProc erstellt? Evtl. ist ein Parameter falsch definiert. Oder es gibt ein Problem zwischen den lokalen und serverseitigen Spracheinstellungen? :gruebel: Zwar nicht optimal, aber kurzfristig hilfreich: definiere den Parameter @datetime in der Procedure als String und übergebe ihn wie oben beschrieben sprachunabhängig... |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Hi,
also die AdoStoredProc liegt genz bequem auf dem unsichtbaren "Formular?" meines Dienstes und wird nicht im Code instanziert. Ich habe die Proc nochmals neu definiert in der AdoStoredProc Komponente und die Parameter überprüft, scheint jedoch alle i.O. zu sein. Zitat:
Zitat:
|
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
Hast du mal versucht von TDateTime auf TSQLTimeStamp umzustellen? Unit: SqlTimSt Gruss Thorsten |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Zitat:
Ich werd dann am Dienstag mal den TSQLTimeStamp ausprobieren... am besten werde ich gleich für sämtliche Dati di in die Datenbank geschrieben werden dieses Format verwenden oder?! lg und bis am Dienstag... 8) |
Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
Entweder verwendet man einen PArameter mit dem Datentyp 'ftDateTime', oder man formatiert die Datumsangabe so:
SQL-Code:
oder man verwendet das Format 'yyyymmdd hh:nn:ss', das funktioniert auch (jedenfalls in T-SQL). Ich verwende das o.g. ODBC-Format. Ist nicht so gut dokumentiert, funzt aber.
select * from Table where DateField = { ts '2008-05-24 12:34:56' }
Am ordendlichsten ist es aber, einen Parameter als ftDateTime zu deklarieren. ADO holt sich dann das gültige Datumsformat vom Server. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:24 Uhr. |
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