AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein MSSQL Stored Procedure -> datetime vergleichsprobleme???
Thema durchsuchen
Ansicht
Themen-Optionen

MSSQL Stored Procedure -> datetime vergleichsprobleme???

Offene Frage von "cherry"
Ein Thema von cherry · begonnen am 7. Mai 2008 · letzter Beitrag vom 12. Mai 2008
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#1

MSSQL Stored Procedure -> datetime vergleichsprobleme???

  Alt 7. Mai 2008, 16:37
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):
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: 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...
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 16:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#3

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 16:54
? ne, is alles genau gleich, scheint jedenfalls so..

2008-05-07 16:12:52.000 = 2008-05-07 16:12:52.000 oder nicht?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 16:58
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...
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von cherry
cherry

Registriert seit: 14. Nov 2005
561 Beiträge
 
RAD-Studio 2009 Ent
 
#5

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 17:04
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

AND ([t_bb_folder_info].[date_time] = @date_time) mit

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?
Ist das nur mein Gefühl, oder ist die ganze Welt verrückt geworden!?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 17:26
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.

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
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 17:35
Hi,

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

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

where datediff( ss, date_time, @date_time ) < 1
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 17:49
Pardon da hab ich mich vergallopiert,
aber das Prinzip ist das gleiche.

( ist schon toll wie kompatibel die SQL-Dialekte sind)

Gruß
K-H
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#9

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 17:55
Hi,

Zitat von p80286:
...
aber das Prinzip ist das gleiche.
Nicht ganz.
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.
Gruß
Norman
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme

  Alt 7. Mai 2008, 18:09
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 02:16 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