Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   MSSQL Stored Procedure -> datetime vergleichsprobleme??? (https://www.delphipraxis.net/113414-mssql-stored-procedure-datetime-vergleichsprobleme.html)

cherry 7. Mai 2008 15:37


MSSQL Stored Procedure -> datetime vergleichsprobleme???
 
hi

ich schreibe ein delphiprogramm das folgende storedprocedure verwendet:

SQL-Code:
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)*/ 
         
);
das Problem liegt in dieser Zeile (in der ersten WHERE Klausel):
SQL-Code:
AND ([t_bb_folder_info].[date_time] = @date_time)
also obwohl in der tabelle mehrere Einträge vorhanden sind die dieser Bedinung entspechen, meint sql das es eben nicht so ist...

lasse ich die Zeile weg oder kommentiere ich sie aus, passiert was passieren soll..

kann ich das:
SQL-Code:
AND ([t_bb_folder_info].[date_time] = @date_time)
grundsätzlich nicht so machen?
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...

Jelly 7. Mai 2008 15:47

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.

cherry 7. Mai 2008 15:54

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
? ne, is alles genau gleich, scheint jedenfalls so..

SQL-Code:
2008-05-07 16:12:52.000 = 2008-05-07 16:12:52.000
oder nicht?

shmia 7. Mai 2008 15:58

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:
function RoundedDateTime(value:TDateTime):TDateTime;
begin
  result := Round(value * 32768) / 32768;
end;
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...

cherry 7. Mai 2008 16:04

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:
AND ([t_bb_folder_info].[date_time] = @date_time)
mit

SQL-Code:
AND ([t_bb_folder_info].[date_time] <> @date_time)
passiert ja was... also scheinen die dati trotzdem nicht überein zu stimmen. aber wo ist der Fehler?

p80286 7. Mai 2008 16:26

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:
to_char(trunc(sysdate),'YYYYMMDD')=to_char(trunc(startdat),'YYYYMMDD')
Hier bist Du Herr des Geschehens weil Du beide Seiten des Vergleichs definiert hast.

Gruß
K-H

NormanNG 7. Mai 2008 16:35

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Hi,

Zitat:

to_char(trunc(sysdate),'YYYYMMDD')=to_char(trunc(s tartdat),'YYYYMMDD')
wenn ich mich nicht irre, wird das in MSSQL nicht gehen. :gruebel:

Ich würde mit datediff(...) arbeiten:

SQL-Code:
where datediff( ss, date_time, @date_time ) < 1

p80286 7. Mai 2008 16:49

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

NormanNG 7. Mai 2008 16:55

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Hi,

Zitat:

Zitat von p80286
...
aber das Prinzip ist das gleiche.

Nicht ganz. :-D
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.

alzaimar 7. Mai 2008 17:09

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:
WHERE Table.DateTimeField Between DateAdd(minute,-1,@Date) and DateAdd (minute,1,@Date)
  AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
Wobei 'dbo.DateOnly' eine UDF ist, die den Datumsanteil eine DateTime-Wertes liefert.
SQL-Code:
CREATE FUNCTION [dbo].[DateOnly] (@Date DateTime)
RETURNS Datetime AS
BEGIN
  Return cast (floor (cast (@Date as float)) as DateTime)
END
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Seite 1 von 4  1 23     Letzte »    

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