Page 2 of 2

PostPosted: Fri Jan 03, 2003 1:22 pm
by Quinn1225
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.

Re: timestamp

PostPosted: Fri Jan 03, 2003 4:02 pm
by Walter4536
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

PostPosted: Fri Jan 03, 2003 6:48 pm
by Willy1492
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.

PostPosted: Mon Jan 06, 2003 12:35 am
by Jessy5246
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

PostPosted: Tue Jan 07, 2003 11:24 am
by Christoph256
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

PostPosted: Tue Jan 07, 2003 2:53 pm
by Walter4536
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