intervall in open sql

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Postby Quinn1225 » Fri Jan 03, 2003 1:22 pm

noch ein kleiner NAchtrag: Der BETWEEN bildet immer das nach beiden Seiten hin geschlossene Interval [min...max], also obj >= min AND obj <= max. Wennn man ein offenes Intervall wie ]min..max[ haben möchte (das heisst die Grenzen min und max gehören nicht mehr zum Intervall), muß man im allgemeinen die Vergleichsoperatoren verwenden, also obj > min AND obj < max.
In einigen Spezialfällen kann man naturlich von den Intervalgrenzen den Nachfolger bzw. Vorgänger bestimmen. Bei einem Intergeger sähe dies wie folgt aus: ]min..max[ kann als obj BETWEEN min_ AND max_ geschrieben werden mit min_ = min + 1 und max_ = max - 1. Das geht jedoch nicht immer. Bei Gleitkommazahlen ist es nicht so einfach.
Quinn1225
..
..
 
Posts: 30
Joined: Thu Jan 02, 2003 4:16 pm

Re: timestamp

Postby Walter4536 » Fri Jan 03, 2003 4:02 pm

gse hat geschrieben:hi frank,

bzgl. des zeitpunkts in der where-klausel.

heisst dass vielleicht, dass ich mir erst zwei timestamp basteln muss (bestehend aus Datum l_datum_ab und Zeitpunkt l_zeit_ab bzw l_datum_bis und l_zeit_bis) und diese dann mit der between - verklausulierung einsetze?

wie gesagt, ich moechte gerne alle eintraege zwischen

l_datum_ab und l_zeit_ab

bis

l_datum_bis und l_zeit_bis

auslesen.

gruss gse


Hallo zusammen,

also ich weiß nicht, wie Ihr das seht, aber ich bin mir ziemlich sicher, dass das mit einem einzigen select statement (zumindest wie oben bereits aufgeführt) nicht machbar ist. Wenn es ein timestamp wäre, dann wäre eine entsprechende Selektion machbar, d.h. meiner Meinung nach müßte man eine interne Tabelle bauen und um einen Timestamp erweitern. Über diese interne Tabelle läßt sich dann mit dem Timestamp die entsprechende Auswahl treffen. Das wäre mein Vorschlag.

Gruss,
Steff
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Postby Willy1492 » Fri Jan 03, 2003 6:48 pm

Klar geht das mit einem einzigen SELECT, nur siehrt dieses SELECT nicht besonders schön aus.

Besser und übersichtlicher wäre aber eine Falluntersscheidung mit verschiedenen SELECTs für die Fälle:
1. von_datum > bis_datum ODER ( von_datum = bis_datum und von_uhrzeit > bis_uhrzeit )
kein SELECT nötig, da Bedingung nicht erfüllbar ist.
(Ich weiß nicht, wie DB-optimizer üblicherweise vorgehen. Ob die Bedingung auf Erfüllbarkeit geprüft wird, bevor selecktiert wird oder nicht.
Wenn der Zugriffsmechanismus (execution plan) aber nur vom statement pattern und den Statistik-Informationen abhängt, ist nicht auszuschließen, daß tatsächlich Satz für Satz geprüft wird, ob das Datum > '20030102' und < '20021210' ist.)
2. von_datum = bis_datum und von_uhrzeit < bis_uhrzeit:
3. von_datum < bis_datum.

(Das Select-Statement für den 3. Fall ist immer noch das komplizierteste, aber nicht SO komplex als wenn ich auch die Falle 1 und 2 in einem SELECT abdecken will.)

Aber ich glaube auch nicht, daß man damit schon alle Probleme gelöst hat.
(In der Annahme, daß dieses Select im Programm mehrfach durchlaufen wird - nämlich für verschiedene Objekte und/oder Usernamen. Da gibt es mit Sicherheit noch Tuning-Potential.
Willy1492
....
....
 
Posts: 581
Joined: Tue Dec 03, 2002 4:44 pm

Postby Jessy5246 » Mon Jan 06, 2003 12:35 am

Moin zusammen:
SELECT *
FROM cdhdr
INTO CORRESPONDING FIELDS OF TABLE it_cdhdr
WHERE objectclas = l_objectclas
AND objectid = l_objectid
AND username = l_userid
AND udate > l_datum_ab
AND udate <= l_datum_bis
AND utime > l_zeit_ab
AND utime <= l_zeit_bis


Just to confuse you even more, you could do one thing to address the issue Frank brought up. Only do:
SELECT *
FROM cdhdr
INTO CORRESPONDING FIELDS OF TABLE it_cdhdr
WHERE objectclas = l_objectclas
AND objectid = l_objectid
AND username = l_userid
AND udate > l_datum_ab
AND udate <= l_datum_bis.
Then loop at it_cdhdr where udate eq l_datum_ab +1 and check utime gt l_zeit_ab. Likewise loop at it_cdhdr where udate eq l_datum_bis and check utime le l_zeit_bis. Remove entries that fail the check. While you select a bit too much, you are sure to only check the first and last date for the time. Or you could issue up to three select statements (day 1, day 2 - n-1, day n) with time checks on the first and last day.

Have fun,
Wolfgang
Jessy5246
..
..
 
Posts: 23
Joined: Tue Dec 03, 2002 8:20 pm

Postby Christoph256 » Tue Jan 07, 2003 11:24 am

Hallo,

ich hatte mal ein ähnliches Problem. Folgender Select müsste funktionieren:

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. FROM cdhdr
  2. INTO CORRESPONDING FIELDS OF TABLE it_cdhdr
  3. WHERE objectclas = l_objectclas
  4. AND objectid = l_objectid
  5. AND username = l_userid
  6. AND &#40;        udate =   l_datum_ab
  7.          AND utime >=  l_zeit_ab
  8.          OR  udate >   l_datum_ab
  9.          AND udate <   l_datum_bis
  10.          OR  udate =   l_datum_bis
  11.          AND utime <=  l_zeit_bis &#41;.
GeSHi ©

Ich gehe natürlich davon aus, das der bis-Zeitpunkt wirklich größer ist als der von-Zeitpunkt.

Gruss Andrea
Christoph256
..
..
 
Posts: 12
Joined: Tue Jan 07, 2003 11:24 am

Postby Walter4536 » Tue Jan 07, 2003 2:53 pm

OK, man lernt eben nie aus :D. Frank, Wolfgang und Andrea, ihr habt vollkommen recht. Es funktioniert mit einem Select, d.h. eine mögliche Lösung ist beispielsweise die von Andrea. Klasse!

Gruss,
Steff
Walter4536
...
...
 
Posts: 315
Joined: Mon Dec 02, 2002 12:09 pm

Previous

Return to ABAP® Core

Who is online

Users browsing this forum: No registered users and 4 guests

cron