Autor |
Beitrag |
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 11:32
das scheint irgendwie an dem Casten zu liegen, da "verschiebt" sich etwas:
SQL-Anweisung 1: 2: 3: 4:
| select Max(LastTrade), Min(LastTrade), CAST(CAST([DateTime] as SmallDateTime) as DateTime) from datei1 where [DateTime] between '16/03/2011 09:05:00.000' AND '16/03/2011 09:05:59.999' group by CAST(CAST([DateTime] as SmallDateTime) as DateTime) |
bringt als Ergebnis:
(Kein Spaltenname) (Kein Spaltenname) (Kein Spaltenname)
6714 6711 2011-03-16 09:05:00.000
6715,5 6713 2011-03-16 09:06:00.000
Das deckt sich ja eigentlich mit den tatsächlichen Ergebnissen der Minute, wirft aber
leider als Ergebnis dann die Kurse für 2 minuten aus - was ja defakto bei oben angegebenem
Zeitraum so nicht stimmen kann.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.10.11 11:39
Zitat: | leider als Ergebnis dann die Kurse für 2 minuten aus - was ja defakto bei oben angegebenem
Zeitraum so nicht stimmen kann. |
Doch  DateTime hat eine Präzision von ungefähr 3 Millisekunden dein '16/03/2011 09:05:59.999' ist also als DateTime gar nicht darstellbar und wird auf '16/03/2011 09:06:00.000' gerundet. Between ist immer inklusiv der Grenzen also bekommst du auch eine Wert für die Daten die genau auf '09:06:00' fallen. Versuch mal bei der oberen Grenze für die Millisekunden anstatt Triple9 mal z.B. 995.
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 11:44
SQL-Anweisung 1: 2: 3: 4:
| select Max(LastTrade), Min(LastTrade), CAST(CAST([DateTime] as SmallDateTime) as DateTime)AS DateTime from datei1 where [DateTime] between '16/03/2011 09:05:00' AND '16/03/2011 09:05:59' group by CAST(CAST([DateTime] as SmallDateTime) as DateTime) |
Hab ich versucht, aber das scheint es nicht zu sein, selbst bei dieser Abfrage hier oben,
kommen als Ergebnis immer 2 Reihen raus:
(Kein Spaltenname) (Kein Spaltenname) DateTime
6714 6711 2011-03-16 09:05:00.000
6715,5 6713 2011-03-16 09:06:00.000
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 11:58
ab der 30. Sekunde scheint er aufzurunden,....das scheint das Problem zu sein
bei der 29. zeigt er noch eine Zeile als Ergebnis an, wenn ich bis zur 30. Sekunde suchen lass
sinds ab dann immer zwei Zeilen
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.10.11 12:20
Zitat: | ab der 30. Sekunde scheint er aufzurunden,....das scheint das Problem zu sein |
Du scheinst Recht zu haben. Der 2008R2 und der Denali Server den ich hier gerade zur Verfügung habe verhalten sich so. Bin mir aber ziemlich sicher das der 2005er sich gestern anders verhalten hat
Ich probier mal ob es eine ebenso einfache aber immer korrekte Gruppierungsmethode gibt.
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 12:27
Danke, das ist super nett !
Ich hab auch schon weiter überlegt, ob man die Abfrage ohne das between macht, sondern
etwas ähnliches sagt (mir fehlt die Syntax) wie
SQL-Anweisung 1: 2: 3: 4:
| select Max(LastTrade), Min(LastTrade), [DateTime] AS DateTime from datei1 where [DateTime] = BEINHALTET '16/3/2011 09:05:REST IST EGAL' group by [DateTime] |
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.10.11 12:36
Folgendes könnte gehen.
SQL-Anweisung 1: 2: 3:
| select Max(LastTrade), Min(LastTrade), CONVERT(datetime, CONVERT(char(16), [DateTime], 121)) from datei1 group by CONVERT(datetime, CONVERT(char(16), [DateTime], 121)) |
Selbe Idee andere Umsetzung. Der Datetime wird in einen string konvertiert der zu kurz ist um den Sekunden/Millisekunden Anteil zu beinhalten und dann wieder zurück in Datetime.
So müsste eigentlich garantiert abgeschnitten werden und nicht gerundet.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 14.10.11 12:37
Hallo fahrstuhl65,
ich hatte dir unter www.c-sharp-forum.de....php?p=652235#652235 als "Edit" einen Link gegeben (ich weiß nicht, ob du den schon gesehen hast).
Kannst ja mal die Ansätze dort ausprobieren.
Edit: Ralf, genau darauf wollte ich hinaus. Als letzter Parameter 'style' müßte auch 20 (bzw. 120) gehen, da ja die Millisekunden eh nicht gebraucht werden (s.a. CAST und CONVERT (Transact-SQL)).
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 12:45
Ralf Jansen hat folgendes geschrieben : |
So müsste eigentlich garantiert abgeschnitten werden und nicht gerundet. |
Hab ich gleich ausprobiert - Ergebnis wie folgt:
Meldung 242, Ebene 16, Status 3, Zeile 3
Bei der Konvertierung eines varchar-Datentyps in einen datetime-Datentyp liegt der Wert außerhalb des gültigen Bereichs.
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 12:46
Th69 hat folgendes geschrieben : | (ich weiß nicht, ob du den schon gesehen hast).
|
nein hatte ich , wahrscheinlich durch das Edit noch nicht gesehen, schau ich mir auch gleich mal an ! Danke....
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.10.11 13:02
Ich versuch mich mal in Ferndiagnose und behaupte das liegt an der Spracheinstellung deines SQLServers  Für den Konvertierungsweg von string->datetime hatte ich kein Format angegeben womit dann der Datenbank default zieht der vermutlich nicht zum von mir benutzen Format 121 passt. Hab das Format jetzt mal für beide Richtung angegeben.
SQL-Anweisung 1: 2: 3:
| select Max(LastTrade), Min(LastTrade), CONVERT(datetime, CONVERT(char(16), [DateTime], 121), 121) from datei1 group by CONVERT(datetime, CONVERT(char(16), [DateTime], 121), 121) |
Edit: TH69. Format sollte doch fast egal sein oder übersehe ich da was? Es werden eh nur die ersten 16 Zeichen benutzt was dahinter alles abgeschnitten wird müsste eigentlich egal sein.
|
|
fahrstuhl65 
      
Beiträge: 30
|
Verfasst: Fr 14.10.11 13:25
@ Ralf
WOW - super...das wars - funzt einwandfrei, ich hab erstmal händisch verglichen,
aber die Daten hauen nun 100 prozentig hin.
Vielen, Vielen Dank dafür !
Jetzt muss ich erstmal ALLE Daten zusammen bekommen und in einer DB vereinen
mit der Abfrage, dann kann ich an die eigentliche Aufgabe wieder rangehen,
aber das hat mir schon sehr weiter geholfen
Ich komme dann gern nochmal, wenns erlaubt ist, mit weiteren Fragen in diesem Thread
auf Euch zu ?
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 14.10.11 13:38
Hallo Ralf,
naja, bei so etwas bin ich immer ein bißchen ein Performance/Optimier-Freak (warum sollen erst intern die Millisekunden an den String gehängt werden, um sie dann doch nicht zu benutzen - denn ich glaube nicht, daß dort die DB "lazy evaluation" betreibt). Wenn es direkt eine Lösung nur auf Minuten gäbe, so wäre das natürlich am besten.
Und fahrstuhl65,
weitere Fragen in diesen Thread bitte nur, wenn sie noch zum Titel passen - ansonsten: neue Frage - neuer Thread.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 14.10.11 14:01
Zitat: | naja, bei so etwas bin ich immer ein bißchen ein Performance/Optimier-Freak |
Und dann startest du keine Diskussion darüber das diese Lösung die Datenbankindizes nicht verwendet 
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Fr 14.10.11 15:00
Hallo Ralf,
ich habe in diversen Foren gelernt, daß doch Microoptimierungen viel besser sind als sich über grundlegende Algorithmen Gedanken zu machen
Leider ist mir ja auch noch keine wirklich gute Lösung im Internet aufgefallen, um dieses Problem wirklich effizient anzugehen (es müßte eine TruncateToMinute(DateTime) Funktion geben)...
|
|
|