Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

NormanNG 7. Mai 2008 18:16

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Zitat:

Zitat von alzaimar
Die Funktion 'DateDiff' wird den Einsatz eines Index verhindern....

Das mit dem Index stimmt natürlich.

Aber der Minutenbereich ist doch eigendlich zu groß?
SQL-Code:
WHERE Table.DateTimeField Between DateAdd(minute,-1,@Date) and DateAdd (minute,1,@Date)
Damit wird doch nicht nur die gewünschte Zeit, sondern auch 1 Minute vorher/nachher zurückgeliefert, oder?

alzaimar 7. Mai 2008 21:51

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Dann nimm halt ne Sekunde ('second') oder 'millisecond'.

cherry 8. Mai 2008 07:02

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Zitat:

Zitat von alzaimar
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.

also wenn ich jetzt mal von dem aus gehe... habe ich noch ein paar fragen...

1.) reicht das nicht schon alleine?
SQL-Code:
WHERE Table.DateTimeField Between DateAdd(second,-1,@Date) and DateAdd (second,1,@Date)
2.) wozu ist denn das hier jetzt genau?!:
SQL-Code:
AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
3.) und was die Funktion DateOnly genau aus meinem Datum macht erkenn ich auch nicht so auf den ersten Blick?!

aber vielen Dank schon mal für die vielversprechenden Antworten

//EDIT

sehe ich das richtig:
dieses hier:
SQL-Code:
WHERE Table.DateTimeField Between DateAdd(second,-1,@Date) and DateAdd (second,1,@Date)
vergleicht nur die sekunden, nicht aber das Datum und die Zeit auf sekunden genauigkeit?

deshalb muss ich mit
SQL-Code:
AND dbo.DateOnly (Table.DateTimeField) = dbo.DateOnly(@Date)
noch das Datum vergleichen?

trotzdem was macht die Funktion DateOnly genau?

NormanNG 8. Mai 2008 07:35

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Hi,

Zitat:

Zitat von cherry
trotzdem was macht die Funktion DateOnly genau?

intern werden datetime-Werte als float gespeichert, wobei das Datum im
Vorkomma- und die Zeit im Nachkommateil abgebildet sind. Die DateOnly-Funktion
macht nichts anderes, als den Nachkommateil abzuschneiden.

cherry 8. Mai 2008 07:41

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:
[t_bb_folder_info].[date_time] Between DateAdd(hour,-1,@date_time) and DateAdd(hour,1,@date_time)
noch so...

SQL-Code:
DateAdd(hour,0,[t_bb_folder_info].[date_time]) Between DateAdd(hour,-1,@date_time) and DateAdd(hour,1,@date_time)
... findet sql die gewünschten datensätze mein SELECT SUM() gibt also NULL resp. 0 zurück ;-(

ich mach wohl noch was anderes falsch, aber was denn?

NormanNG 8. Mai 2008 07:58

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Hi,

um zu sehen, mit welchen Werten gearbeitet wird, lass dir die Daten doch mal anzeigen:

SQL-Code:
select DateAdd(hour,-1,@date_time), DateAdd(hour,1,@date_time), [t_bb_folder_info].[date_time] ...
Das hier übrigends...
SQL-Code:
where DateAdd(hour,0,[t_bb_folder_info].[date_time]) Between ...
hat wieder das Problem mit dem Index, da die Tabellenspalte in einer Funktion "verpackt" ist
und somit kein Index verwendet werden kann.

cherry 8. Mai 2008 07:58

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
wie wärs dann damit?

SQL-Code:
CAST([t_bb_folder_info].[date_time] AS CHAR(25)) = CAST(@date_time AS CHAR(25))
geht bei mir aber leider auch net...
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:
2008-05-07 15:16:32.000
wenn ich nun meine procedure ausführe und als @date_time parameter ebenfalls
SQL-Code:
2008-05-07 15:16:32.000
mitgebe funktioniert ja das alles nicht mit keiner bisher getesteten variante...

Zitat:

Zitat von NormanNG
intern werden datetime-Werte als float gespeichert, wobei das Datum im
Vorkomma- und die Zeit im Nachkommateil abgebildet sind. Die DateOnly-Funktion
macht nichts anderes, als den Nachkommateil abzuschneiden.

kann ich jetzt davon ausgehen das z.B. eben ein mit select ausgelesenes feld z.B. "2008-05-07 15:16:32.000" ergibt, nicht dasselbe ist wie:
SQL-Code:
CAST("2008-05-07 15:16:32.000" AS datetime);
???

//EDIT

Zitat:

Zitat von cherry
wie wärs dann damit?
SQL-Code:
CAST([t_bb_folder_info].[date_time] AS CHAR(25)) = CAST(@date_time AS CHAR(25))

erübrigt sich wohl wegen des indexes, richtig?! :P hab doch schon was gelernt

cherry 8. Mai 2008 08:04

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
Zitat:

Zitat von NormanNG
Hi,

um zu sehen, mit welchen Werten gearbeitet wird, lass dir die Daten doch mal anzeigen:
SQL-Code:
select DateAdd(hour,-1,@date_time), DateAdd(hour,1,@date_time), [t_bb_folder_info].[date_time] ...

funktioniert, aber was bringt mir das nun... (sorry 1. morgen in der früh... 2. ich bin kein blitzmerker)

ausgabe:

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
usw

NormanNG 8. Mai 2008 08:09

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:

funktioniert, aber was bringt mir das nun... (sorry 1. morgen in der früh... 2. ich bin kein blitzmerker)
Das das funktioniert ist klar. Du sollst dir die Spalten ansehen und prüfen, ob deine
Bedingung richtig fornuliert ist.

cherry 8. Mai 2008 08:15

Re: MSSQL Stored Procedure -> datetime vergleichsprobleme
 
SQL-Code:
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)
gibt mir keinen einzigen datensatz zurück...
obwohl

SQL-Code:
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]
folgendes zurück gibt:

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
.
.
.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
Seite 2 von 4     12 34      

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 by Thomas Breitkreuz