Vergleich von Datum

_MaLu_

Neuer Benutzer
Beiträge
3
Hallo SQLer!
Ich versuche Datensätze in einem bestimmten Zeitraum zu zählen. Ich bekomme aber immer wieder die Warnung "Konvertierung vom Spaltentyp weg kann zu einem nicht-optimalen Abfrageplan führen".
Hier ist der betreffende Teil der WHERE Klausel:

... and
(to_number(to_char(s.a, 'yyyy')) >= 2000 and to_number(to_char(s.e,'yyyy')) >= 2000)

a bzw. e sind die zu vergleichenden Spalten einer Tabelle s und liegen als DATE vor.

Gefühlt habe ich schon alle möglichen Kombinationen versucht...

Habt ihr eine Idee?

LG
_MaLu_
 
Werbung:
Das ist keine Oracle Fehlermeldung. Ich vermute, dass kommt von Deinem SQL Client. Hintergrund der Warnung ist, dass ein möglicher Index auf der Spalte a nicht verwendet werden kann. Besser wäre es die Spalte mit den Bereichen des Jahres zu vergleichen.

Z.B. um alle Einträge im Jahr 2000 zu bekommen:
Code:
where s.a >= date '2000-01-01'
  and s.a < date '2001-01-01'
Damit wir der der Wert von a direkt verwendet und damit kann ein Index auch verwendet werden um die Abfrage zu beschleunigen.

Beachte das < mit dem Anfang des nächsten Jahres. Das ist wichtig, weil ein DATE in Oracle immer auch eine Zeit enthält.

Unabhängig davon: einfacher wäre extract(year from s.a) - da kriegst Du gleich eine Zahl und brauchst nicht die Konvertierung von DATE nach VARCHAR und dann zu NUMBER
 
Guten Morgen

warum diese to_number(to_char(...) - Orgie? Kann es sein, daß BETWEEN Dir unbekannt ist?
Auch BETWEEN führt übrigens zur selben Warnung ;)
Ich war ehrlich gesagt zu faul, alle Versuche zu dokumentieren...

Das ist keine Oracle Fehlermeldung. Ich vermute, dass kommt von Deinem SQL Client. Hintergrund der Warnung ist, dass ein möglicher Index auf der Spalte a nicht verwendet werden kann. Besser wäre es die Spalte mit den Bereichen des Jahres zu vergleichen.

Z.B. um alle Einträge im Jahr 2000 zu bekommen:
Code:
where s.a >= date '2000-01-01'
  and s.a < date '2001-01-01'
Damit wir der der Wert von a direkt verwendet und damit kann ein Index auch verwendet werden um die Abfrage zu beschleunigen.

Beachte das < mit dem Anfang des nächsten Jahres. Das ist wichtig, weil ein DATE in Oracle immer auch eine Zeit enthält.

Unabhängig davon: einfacher wäre extract(year from s.a) - da kriegst Du gleich eine Zahl und brauchst nicht die Konvertierung von DATE nach VARCHAR und dann zu NUMBER
Danke schön, aber auch deine Lösungsvorschläge bringen mich nicht weiter. EXTRACT war mir neu! Danke für den Tipp, wieder was gelernt! Aber auch ohne Erfolg :(

Auf s.a bzw. s.e sind keine Index gelegt...
 
Was bedeutet denn "bringen mich nicht weiter"?
Die Warnung verschwindet nicht? Oder gibt es noch ein anderes Problem?

1. Wenn kein Index auf den Spalten ist, kann Dir die Warnung vollkommen egal sein.
2. Wenn irgendwann mal ein Index darauf kommt, weil es lahm ist, wundert sich vielleicht jemand, dass er gar nicht hilft / verwendet wird.
3. Wenn Du between nutzt, brauchst Du keine anderen Funktionen mehr um diese Spalte herum, sondern arbeitest mit der Original Spalte. Das bedeutet, Du musst Dein Kriterium -damit es trotzdem das Richtige ergibt- umstellen, sozusagen wie eine mathematische Gleichung, damit sie gültig bzw äquivalent zum alten Ausdruck bleibt:
~ where meineOriginalDatumsSpalte between <untererGrenzwert> and <oberer Grenzwert>
4. 3. bedeutet, Du musst Dein altes Kriterium "2000" umrechnen in äquivalente Datumswerte, > 31.12.1999 und < der_erste_Tag_des_Jahres_nachdem_2000_vorbei_ist.
5. dabei musst Du wie @castorp schrieb, die Uhrzeit berücksichtigen, falls sie in der Datumsspalte gespeichert ist.
 
Werbung:
Zurück
Oben