badfsaadkl
Goto Top

Dynamische SQL Abfrage nach Wochentag

Dynamische SQL Abfrage je nach Wochentag

Moin zusammen,

ich habe eine SQL Abfrage, welche mir je nach Wochentag einen anderen Intervall nehmen soll.


SELECT
*
FROM
change ch
WHERE
ch.closedate >= SYSDATE -24/24


Hier ist die Frage wie ich den Stundenintervall dynamisch einstellen kann.

Ziel ist das der Bereich SYSDATE folgend bezogen wird.

Dienstag - Sonntag = SYSDATE -24/24
Montag = SYSDATE -96/24

Mittels folgendem Code bekomme ich ja den jetzigen Wochentag raus:


SELECT to_char(SYSDATE,'Day') from dual


Nur jetzt möchte ich wie gesagt abfragen, je nachdem was für ein Wochentag ist, soll ein anderer Zeitraum genommen werden.

Wie kann ich das als Variable deklarieren, bzw. habt Ihr eine Idee ?

Merci

Content-ID: 197891

Url: https://administrator.de/forum/dynamische-sql-abfrage-nach-wochentag-197891.html

Ausgedruckt am: 22.12.2024 um 23:12 Uhr

nxclass
nxclass 30.01.2013 aktualisiert um 08:59:01 Uhr
Goto Top
Hi,

werte die Rückgabe der TO_CHAR() Funktion in einem IF oder CASE aus.

http://www.techonthenet.com/oracle/loops/if_then.php
LianenSchwinger
LianenSchwinger 30.01.2013 aktualisiert um 09:16:50 Uhr
Goto Top
Hallo,

einfach in der WHERE-Klausel ein CASE Konstrukt bauen.

z.B.

SELECT co.order_no, co.date_entered
FROM customer_order co
WHERE CASE WHEN TO_CHAR(SYSDATE,'D') <= 5   
           THEN SYSDATE -24/24
           ELSE SYSDATE -96/24
      END <= co.date_entered

Es ist übrigens immer ganz hilfreich, wenn man die verwendetet Datenbank angibt (MySQL, Oracle, Access ...)

Gruß Jörg
BadFsaadKl
BadFsaadKl 30.01.2013 um 09:10:17 Uhr
Goto Top
Moin,

bin im SQL mit den IF Schleifen net so fit. Aber funktioniert irgendwie net.

IF select to_char(sysdate,'Day') from dual = 'Montag' THEN
SELECT
*
FROM
change ch
WHERE
ch.closedate >= SYSDATE -96/24
ELSE
SELECT
*
FROM
change ch
WHERE
ch.closedate >= SYSDATE -24/24
END IF

Diese Variante ist aber auch bissle Umständlich, da mein eigentliches SQL Statement um eingies größer ist.
Und der Übersichthalber würde ich (falls möglich) eher mit Variablen arbeiten.
LianenSchwinger
LianenSchwinger 30.01.2013 um 09:21:14 Uhr
Goto Top
... übrigens wass soll das mit dem -24/24 (= -1) und -96/24 (= -3) ?!?
Da kannst Du auch direkt -1 bzw. -3 nehmen. Wenn Du die vollen Tage ohne Uhrzeit möchtest musst Du das jeweilige Datum wandeln oder beschneiden z.B. TRUNC(SYSDATE).

Gruß Jörg
BadFsaadKl
BadFsaadKl 30.01.2013 um 09:33:15 Uhr
Goto Top
Moin,

Betrifft eine Oracle DB.

Habe es jetzt wie folgt gelöst.
WHERE
CASE WHEN TO_CHAR(SYSDATE,'D') = '1'
THEN SYSDATE -96/24
ELSE SYSDATE -24/24
END <= ch."closeddate"
ORDER BY ch."closeddate" ASC

Der Punkte mit den -24/24 und -96/24 ist nötig, da ich den genauen Stundenintervall benötige.
LianenSchwinger
LianenSchwinger 30.01.2013 aktualisiert um 09:49:26 Uhr
Goto Top
Hallo,

dann hat meine Version ja funktioniert. face-wink

Bei Oracle (und ich denke bei allen anderen auch face-smile ) ergibt

SYSDATE-24/24
SYSDATE-1

das selbe Ergebnis.

Und bitte noch den Thread als gelöst markieren.

Gruß Jörg
BadFsaadKl
BadFsaadKl 30.01.2013 um 10:11:34 Uhr
Goto Top
Moin Jörg,

ja, hätte auch funktioniert.

nur wenn Chef sagt, er will es im Stundentakt so angegeben habe, dann mach ich das halt.
Auch wenn ich 4 Zeichen mehr tippen muss face-wink
LianenSchwinger
LianenSchwinger 30.01.2013 aktualisiert um 10:35:24 Uhr
Goto Top
... man kann auch dem Chef mal wiedersprechen. face-smile bzw. sollte man auch um zu zeigen, dass man auch Ahnung hat.

Ich korrigiere die SQL-Scripte meines Chefs wenn ich die zu grottig finde oder die Performanz nicht stimmt.

Gruß Jörg