Datum von bis...

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
tomovic
Benutzer
Beiträge: 93
Registriert: Mi 11. Nov 2015, 15:27

Datum von bis...

Beitrag von tomovic » Mi 8. Feb 2017, 13:37

Hallo,
ich möchte gerne alle RE von 2017-10-01 bis 2017-12-31 angezeigt haben, das geht aber Irgendwie nicht ?!
Sowohl 2016-12-01 bis 2017-12-31
Leider weis ich nicht wie ich das Formulieren ich soll. Ich bekomme immer die Jan 2017 angezeigt.

Code: Alles auswählen

         select * from auftrag where  auftragsart = 'Rechnung' AND 
                   ((extract(month from redatum) >= 10 AND extract(year from redatum) =2017)
                   OR
                   (extract(month from redatum) <=12 AND extract(year from redatum) =2017));

castorp
Erfahrener Benutzer
Beiträge: 1177
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Datum von bis...

Beitrag von castorp » Mi 8. Feb 2017, 13:45

Code: Alles auswählen

select * 
from auftrag 
where auftragsart = 'Rechnung' 
  AND redatum between date '2017-10-01' and date '2017-12-31'
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

tomovic
Benutzer
Beiträge: 93
Registriert: Mi 11. Nov 2015, 15:27

Re: Datum von bis...

Beitrag von tomovic » Mi 8. Feb 2017, 14:04

1000 Dank, fast perfekt. :-)

Wie kann ich den Tag weglassen?
Weil 2017-02-01 - 2017-02-!!!!31!!!! geht nicht.
Ich möchte NUR Jahr Monat bis JAhr Maonat angeben.

castorp
Erfahrener Benutzer
Beiträge: 1177
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Datum von bis...

Beitrag von castorp » Mi 8. Feb 2017, 15:28

tomovic hat geschrieben:
Mi 8. Feb 2017, 14:04
Wie kann ich den Tag weglassen?
Weil 2017-02-01 - 2017-02-!!!!31!!!! geht nicht.
Ich möchte NUR Jahr Monat bis JAhr Maonat angeben.
Du könntest sowas machen:

Code: Alles auswählen

select * 
from auftrag 
where auftragsart = 'Rechnung' 
  AND redatum between  date '2017-02-01' and date '2017-03-01' - 1
Also alles "zwischen dem 1.2. und dem Tag vor dem 1.3"

Oder sowas:

Code: Alles auswählen

select * 
from auftrag 
where auftragsart = 'Rechnung' 
  AND redatum >= date '2017-02-01'
  AND redatum < date '2017-03-01'
beachte das < in der zweiten Bedingung!

Oder sowas:

Code: Alles auswählen

select * 
from auftrag 
where auftragsart = 'Rechnung' 
  AND where (extract(year from redatum), extract(month from redatum)) = (2017,2)
oder das obige Prinzip für mehr als einen Monat:

Code: Alles auswählen

select * 
from auftrag 
where auftragsart = 'Rechnung' 
  AND where (extract(year from redatum), extract(month from redatum)) between (2017,2) and (2017,4)
Die letzten beiden Variante können aber keinen Index auf der Spalte redatum verwenden. Aus Performance-Sicht ist die erste oder zweite Lösung wesentlich besser.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7681
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Datum von bis...

Beitrag von akretschmer » Do 9. Feb 2017, 08:06

Btw.: für die beiden letzteren Versionen könnte man einen funktionalen Index verwenden. ;-)
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

Antworten