Das Datum für gestern für heute und für morgen auf einer Tabelle darstellen

Guten Morgen zusammen, würde gerne bei einer Abfrage Werte für 3 Tage anzeigen lassen, sprich für gestern heute und morgen, die Abfrage sieht so aus aber ich mache dabei irgendwie einen Fehler oder es ist einfach nicht möglich es so zu machen wie ich mir das vorstelle.

Nur das Datum von heute anzeigen:

select spdat8,spmasn,sppenr,spkzns,spkzfs,spkzss,sptext,spkos1,spkos2,psnavo,psnafa FROM kasppo INNER JOIN vepsta ON sppenr = pspenr WHERE 
spkos2 IN (1506, 1510, 1515, 1525) 
AND 
(to_date(spdat8::numeric::text,'yyyymmdd') = current_date)
ORDER BY spdat8,spmasn

Das Datum von gestern, heute und morgen anzeigen:

select spdat8,spmasn,sppenr,spkzns,spkzfs,spkzss,sptext,spkos1,spkos2,psnavo,psnafa FROM kasppo INNER JOIN vepsta ON sppenr = pspenr WHERE 
spkos2 IN (1506, 1510, 1515, 1525) 
AND 
(to_date(spdat8::numeric::text,'yyyymmdd') = current_date - 1)
AND 
(to_date(spdat8::numeric::text,'yyyymmdd') = current_date)
AND 
(to_date(spdat8::numeric::text,'yyyymmdd') = current_date + 1)
ORDER BY spdat8,spmasn

Wenn ich das so mache zeigt mir Tabelle einfach alle Werte aus der Datenbank.

Kann man irgendwie bei PHP das kombinieren?

Vielen Dank

Du willst ein OR - eine Spalte kann nicht gleichzeitig drei verschiedene Werte haben - das ist nämlich was das AND bedeutet.

Kürzer geht das mit einem IN:

where to_date(spdat8::numeric::text,'yyyymmdd')  in (current_date - 1, current_date, current_date + 1)

oder einer BETWEEN Bedingung:

where to_date(spdat8::numeric::text,'yyyymmdd')  between current_date - 1 AND current_date + 1

Du solltest auch ganz dringend den Datentyp der Spalte spda8 in date ändern.

Es hat wunderbar geklappt mit dem ersten Vorschlag, vielen Dank.

Habe hier eine andere Tabelle bekommen, wo leider Gottes das Datumsfeld noch beschissener eingegeben wurde, und zwar sechsstellig, dadurch funktioniert meine Abfrage nicht da to_date anscheinend achtstellige Werte erwartet, wie könnte ich das umbauen?

where to_date(spdat6::numeric::text,'yyyymmdd')  in (current_date - 1, current_date, current_date + 1)

FEHLER: Datum/Zeit-Feldwert ist außerhalb des gültigen Bereichs: »210713«

wenn ich das hier mache:

where to_date(spdat6::numeric::text,'yymmdd')  in (current_date - 1, current_date, current_date + 1)

bekomme ich das hier:
FEHLER: Quellzeichenkette zu kurz für Formatfeld »yy» DETAIL: Feld benötigt 2 Zeichen, aber nur 1 verbleiben. HINT: Wenn die Quellzeichenkette keine feste Breite hat, versuchen Sie den Modifikator »FM«

das hier gibt mir nichts raus:

where to_date(spdat6::numeric::text,'FMyymmdd')  in (current_date - 1, current_date, current_date + 1)

Gibt es irgendeine Möglichkeit das umzubauen?

Danke

Warum der cast nach ::numeric ?

 to_date(210713::text, 'yymmdd') 

liefert korrekt 2021-07-13 (dabei ist 210713 in Integer Wert). Wenn also spdat6 ein int ist, dann sollte to_date(spdat6::text, 'yymmdd') funktionieren.

Wenn spdat6 ein text oder varchar ist, dann braucht man gar keinen Cast.

Ich habe den cast einfach aus deiner letzten Hilfestellung übernommen :slight_smile:

Habe das hier jetzt getestet

WHERE 
(to_date(spdat6::text,'yymmdd')) 
IN 
(current_date, current_date - 1) 

FEHLER: Quellzeichenkette zu kurz für Formatfeld »yy» DETAIL: Feld benötigt 2 Zeichen, aber nur 1 verbleiben

Was genau steht denn in spdat6 drin? (Und was für ein Datentyp ist das?)
Wenn da wirklich 210713 drin steht, dann kommt dieser Fehler nicht.

in spdat6 steht das Datum in der Form yymmdd, ist numeric(6,0)

gebe ich in der sql console folgendes ein, funktionierts:

select to_date(spdat6::text, 'yymmdd') from vetour;

gebe ich folgendes ein, kriege ich eine fehlermeldung:

select * from vetour where to_date(spdat6::text, 'yymmdd') in (current_date);

SQL-Fehler:

FEHLER: Quellzeichenkette zu kurz für Formatfeld »yy» DETAIL: Feld benötigt 2 Zeichen, aber nur 1 verbleiben. HINT: Wenn die Quellzeichenkette keine feste Breite hat, versuchen Sie den Modifikator »FM«.

In der Anweisung:
SELECT COUNT(*) AS total FROM (select * from vetour where to_date(spdat6::text, ‘yymmdd’) in (current_date)) AS sub

Schwer zu sagen wenn man die Daten nicht sieht. Meine Vermutung ist, dass da z.B. irgendwo mal 21713 drin steht (anstatt 210713)

Du könntest Dir eine Funktion schreiben, die keinen Fehler wirft:

create function fix_stupid_date(p_input numeric)
  returns date
as
$$
begin
  return to_date(p_input::text, 'yymmdd');
exception 
  when others then
    return date '0001-01-01';
end;
$$
language plpgsql;

Und dann z.B. damit prüfen welche Werte an dem Fehler schuld sind.

select spdat6
from vetour
where fix_stupid_date(spdat6) = date '001-01-01';

Habe einfach die Strukturierung der Tabellen geändert und nu läuft es.

Danke :slight_smile: