2017-01-26 7 views
1

Ich möchte eine Abfrage erstellen, die, wenn es am Montag ausgeführt wird, Daten von Freitag abruft. Wenn es ein anderer Wochentag ist, sollte es Daten des vorherigen Tages abrufen. Im Moment habe ich diese Abfrage, die perfekt außer am Montag arbeitet:Erhalten Freitag Daten am Montag

Select sum(od.shippedqty) as SHIPPEDQTY 
from orderdetail od, orders o 
Where o.orderkey = od.orderkey 
and to_char(o.actualshipdate, 'YYYYMMDD') = to_char(sysdate, 'YYYYMMDD') -1 

ich versucht habe, etwas mit einem Fall, Funktion und alle Arten von Tipps, die im Internet zu finden, aber ich habe es nicht geschafft zu bekommen es funktioniert. Wer kann mir helfen.

+0

bitte zeigen Sie Ihre Arbeit für Freitag (Ihre Case-Anweisung). – Hari

Antwort

4

Wenn diese Abfrage für Sie OK funktioniert, ändern Sie einfach den -1 ganz am mit

Ende
- case to_char(sysdate, 'Dy') when 'Mon' then 3 else 1 end 

das gesagt ist - wie Sie 1 aus einem String subtrahieren? Oracle konvertiert diese Zeichenfolge zurück in eine Zahl für Sie, aber das wird nicht korrekt als Datum funktionieren.

Rather:

... and o.actualshipdate >= trunc(sysdate) - <expression from above> 
    and o.actualshipdate < trunc(sysdate) - <expression from above> + 1 

Das ist besser als trunc auf der linken Seite unter Verwendung von und den Vergleich zu trunc(sysdate), da es die Verwendung eines Index auf actualshipdate ermöglicht (vorausgesetzt, es ist, wie es sein sollte wenn Sie ähnliche Anfragen häufig ausführen).

Bearbeiten: Siehe MT0 Kommentar unten (danke, MT0!). Natürlich hat er recht; Wenn die Abfrage in nicht englischsprachigen Gebietsschemas verwendet werden kann, kann dies ein Problem sein. Selbst mit meiner vorgeschlagenen Änderung der where Klausel, gibt es immer noch eine to_char() in der ganzen Sache - in der case Ausdruck. Das sollte geschrieben werden als:

to_char(sysdate, 'Dy', 'nls_date_language = English') 
+1

Möglicherweise müssen Sie explizit das 'NLS_DATE_LANGUAGE' als drittes Argument von' TO_CHAR() 'definieren, da die Abfrage andernfalls in verschiedenen Gebietsschemas zu unerwarteten Ergebnissen führen kann. – MT0

+0

@ MT0 - natürlich. Ich habe dazu eine Notiz hinzugefügt. – mathguy

+0

Abfrage wird jetzt als erstellt: Wählen Sie Summe (od.shippedqty) als SHIPPEDQTY von Ordertod od, Orders 0 Wo o.orderkey = od.orderkey und o.actualshipdate> = trunc (sysdate) - case to_char (sysdate, ' Dy ') wenn' Mo 'dann 3 else 1 Ende und o.actualshipdate

1

Sie verwenden können:

CASE TRUNC(your_date) - TRUNC(your_date, 'IW') 
    WHEN 0 THEN your_date - INTERVAL '3' DAY -- Monday 
    WHEN 6 THEN your_date - INTERVAL '2' DAY -- Sunday 
     ELSE your_date - INTERVAL '1' DAY -- Tuesday - Saturday 
END AS previous_workday 
+0

@ mathguy. Die Abfrage läuft ohne Fehler. Brauchen Sie Montag zu überprüfen, ob es die richtigen Daten erzeugt. –

+0

@MartijnDrohm - das ist, was Sie denken. Versuchen Sie es am 1. Februar zu laufen. Die rechte Seite wird "20170201" - 1 "sein, das ist 20170200; Der Vergleich schlägt fehl und Sie erhalten keine Zeilen zurück. – mathguy

+0

@ MT0 - Das OP scheint die Abfrage an Wochentagen auszuführen (nicht am Samstag oder Sonntag), also wird das vielleicht nicht benötigt. Außerdem wird Oracle die einfachen Anführungszeichen um die * Sprache * fallen lassen, aber streng genommen sollten sie nicht da sein. – mathguy

Verwandte Themen