PDA

View Full Version : SQL - Datum (8,0) drehen und abfragen



Peter Kosel
30-04-03, 15:30
Hallo *all,

ich habe folgendes Problem :

Datei mit einem numerischen Feld 8,0 mit einem Datum ttmmjjjj als Inhalt.
Jetzt möchte ich das Datum in einem Select drehen und in der Where-Klausel abfragen.
Ist so etwas Möglich, und wenn ja wie ?
Probiert habe ich es bereits so :

select SUBSTR(DIGITS(PAUSTRITT), 5, 4) CONCAT
SUBSTR(DIGITS(PAUSTRITT), 3, 2) CONCAT SUBSTR(DIGITS(PAUSTRITT), 1,
2) AS AUSTRITT from hdscw/hansalf1 where austritt > '00000000'

Für eine Idee bin ich sehr dankbar !!

Peter

rmittag
30-04-03, 16:24
select * from
( select SUBSTR(DIGITS(PAUSTRITT), 5, 4) CONCAT
SUBSTR(DIGITS(PAUSTRITT), 3, 2) CONCAT
SUBSTR(DIGITS(PAUSTRITT), 1, 2)
AS AUSTRITT from hdscw/hansalf1) x
where austritt > '00000000'

Peter Kosel
02-05-03, 08:03
Hallo,

leider funktioniert der SQL so nicht.
Fehlermeldung :

Spalte Austritt nicht in Tabelle...

Noch 'ne Idee ?

Gruß
Peter

Peter Kosel
02-05-03, 08:05
Sorry,

Tippfehler meinerseits, funktioniert natürlich prima!!

Vielen Dank

Peter

Fuerchau
02-05-03, 09:20
Dies ist natürlich so möglich, aber nicht performant, da man erst eine Ergebnistabelle erstellt, die dann abgefragt wird.
Besser ist, den Ausdruck in der WHERE-Bedingung anzugeben (man kann auch Berechnungen abfragen):

select * from hdscw/hansalf1
where SUBSTR(DIGITS(PAUSTRITT), 5, 4) CONCAT SUBSTR(DIGITS(PAUSTRITT), 3, 2) CONCAT SUBSTR(DIGITS(PAUSTRITT), 1, 2) > '00000000'

[Dieser Beitrag wurde von Fuerchau am 02. Mai 2003 editiert.]

Peter Kosel
02-05-03, 09:40
Nochmals vielen Dank, man lernt ja irgendwie nie aus :-))

BenderD
02-05-03, 12:39
Hallo,
nur um falschem verständnis vorzubeugen:
1. SQL handelt per Definition Ergebnismengen orientiert und der Optimizer des Datenbank Management Systems entscheidet, wie eine Abfrage ausgeführt wird. Welche Form eines Queries schneller ist, sagt höchstens was über die Qualität des Optimizers aus.
2. Die angeblich bessere Formulierung mit der Operation im Select ist
keineswegs so gut, wie der Autor meint, hier wird das Datum zweimal verzwazzelt, im SELECT und in der WHERE Klausel.
Wenn schon, dann:

select SUBSTR(DIGITS(PAUSTRITT), 5, 4) CONCAT
SUBSTR(DIGITS(PAUSTRITT), 3, 2) CONCAT SUBSTR(DIGITS(PAUSTRITT), 1,
2) from hdscw/hansalf1 where paustritt > xyz

und bei xyz den verdrehten Abfragewert hinschreiben. Wenn der variabel ist kann man das auch mit SQL bewerkstelligen:

dec(substr(...) concat ...)

3. der Original Versuch ging übrigens nicht, weil die WHERE Klausel vor der SELECT Klausel ausgeführt wird und deshalb die dort benannten Felder noch nicht bekannt sind.

mfg

Dieter Bender

<BLOCKQUOTE><font size="1" face="Verdana, Arial">Zitat:</font><HR>Original erstellt von Fuerchau:
Dies ist natürlich so möglich, aber nicht performant, da man erst eine Ergebnistabelle erstellt, die dann abgefragt wird.
Besser ist, den Ausdruck in der WHERE-Bedingung anzugeben (man kann auch Berechnungen abfragen):

select * from hdscw/hansalf1
where SUBSTR(DIGITS(PAUSTRITT), 5, 4) CONCAT SUBSTR(DIGITS(PAUSTRITT), 3, 2) CONCAT SUBSTR(DIGITS(PAUSTRITT), 1, 2) &gt; '00000000'

[Dieser Beitrag wurde von Fuerchau am 02. Mai 2003 editiert.][/quote]

Fuerchau
02-05-03, 13:33
@dieter

Wie du in der ursprünglichen Frage sehen kannst, steht das Datum in der Form TTMMJJJJ zur Verfügung, so dass ich mit dem umgedrehten Wert die Abfrage ausführen muss.

Wenn ich also PAUSTRITT direkt abfrage, habe ich das Problem, dass ich sinnvoll nur auf = abfragen kann.
Deshalb ist es besser, im Where den Ausdruck abzufragen an Stelle des Feldes.

Wenn ich PAUSTRITT allerdings in der umgedrehten Form auch als Ergebnis benötige, dann sollte ich natürlich so wie rmittag abfragen.