Oracle SQL Abfrage - Sysdate zwischen heute und 3 Tage in der Zukunft

dhuuk42

Grünschnabel
Hallo,

ich benötige für einen Standardreport den wir auf Tagesbasis durchführen eine automatische Bedingung. Diese Bedingung soll in Klarschrift lauten:

Liefere Ergebnisse die zwischen heute und 3 Tage in der Zukunft liegen

Würde bedeuten:
SQL:
where tbl_out_order.host_delivery_date Between sysdate and (sysdate + 3)

Ich bin auch soweit, dass ich per select die daten auswählen muss.
SQL:
SELECT TO_CHAR
(SYSDATE - 1, 'YYYYMMDD') as today
FROM DUAL;

Allerdings habe ich keine Ahnung wie ich dieses Select Statement in die where Abfrage einbauen kann. Vorallem nicht mit zwei Werten (sysdate und sysdate +3 )

Vielen Dank für Eure Hilfe!

Beste Grüße,

dhuuk42
 
Hi,

SQL:
SELECT *
FROM tbl_out_order o
WHERE o.host_delivery_date BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;

Das TRUNC() sorgt dafür dass du effektiv BETWEEN "03.09.2017 00:00:00.0000" AND "05.09.2017 23:59:59.9999" hast.

Grüsse,
BK
 
Das Problem ist, dass das Datum "host_delivery_date" im Format YYYYMMDD in der Datenbank steht. Also rein vom Typ her kein wirkliches Datum ist. Deswegen kann ich es leider nicht pur mit sysdate lösen

theoretisch müsste ich ja aus dem sysdate einen string machen mit to_char oder?
 
Dann konvertiere in ein Datum
SQL:
WHERE TO_DATE(o.host_delivery_date, 'YYYYMMDD') BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;
 
Moin dhuuk42,

du kannst entweder aus dem host_delivery_date mit to_date ein Datum machen oder aus den beiden sysdates einen String.



SQL:
SELECT *
  FROM tbl_out_order o
  WHERE to_date(o.host_delivery_date, 'YYYYMMDD')  BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;

SELECT *
  FROM tbl_out_order o
  WHERE o.host_delivery_date BETWEEN to_char(SYSDATE - 3, 'YYYYMMDD') AND to_date( SYSDATE-1, 'YYYYMMDD') ;

Ggf noch mit NVL() abfangen, falls das host_delivery_date NULL oder kein gültiges Datum ist.

Und wenn das host_delivery_date nur in Genauigkeit YYYYMMDD vorliegt, dann braucht auch keine Sekunde irgendwo abgezogen werden.

Grüße
Biber
 
Hey Leute! Perfekt Danke. Es funktioniert bei mir jedoch nur mit der Variante
SQL:
SELECT *
  FROM tbl_out_order o
  WHERE to_date(o.host_delivery_date, 'YYYYMMDD')  BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;

beim Vorschlag von Yaslaw bekomme ich einen: ORA-01861: literal does not match format string

So oder so! Es läuft vielen Dank!
 
Meine Version versus deine Version
SQL:
WHERE TO_DATE(o.host_delivery_date, 'YYYYMMDD') BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;
WHERE to_date(o.host_delivery_date, 'YYYYMMDD')  BETWEEN TRUNC(SYSDATE - 3) AND TRUNC(SYSDATE) - 1/86400;
Ich sehe den Unterschied nicht. Aber deine sollte gehen und meine nicht? Komisch
Was solls. Hauptsache es funktioniert jetzt
 
Ach da hab ich Quatsch erzählt. Variante 2 von Biber3 führt zum "Literal Fehler".

Yaslaws war die Problemlösung ;)
 
Reumütiger Nachtrag:

es sollte natürlich in meinem 2. Statement nicht stehen

...BETWEEN to_char(SYSDATE - 3, 'YYYYMMDD') AND to_date( SYSDATE....
sondern:
BETWEEN to_char(SYSDATE - 3, 'YYYYMMDD') AND to_char( SYSDATE....

Offensichtlich ist keine Codezeile zu kurz für einen Syntaxfehler. ;-)

Grüße
Biber
 
Zurück