SQL Datumseinteilung

Stingrays

Neuer Benutzer
Beiträge
2
Hallo liebe Community,
Ich suche schon vergeblich seit 2-3 Stunden nach einer Lösung für eine Abfrage. Zahlreiches Googlen und Foren durchstöbern hat mich bisher nicht an das gewünschte Ergebnis gebracht.
Der Beitrag Zeitraum in kleinere Zeiträume einteilen | Datenbank-Forum War schon recht ähnlich, jedoch bin ich auch damit nicht zu meinem Ziel gekommen.

Nun zuerst einmal die Beschreibung
Mit einer Abfrage möchte ich herausfinden, welche Menschen seit dem Jahr 01.01.2000 im Sommerhalbjahr geboren wurden und welche im Winterhalbjahr geboren wurden, also immer zwischen dem Zeitraum '200X-20-03' '200X-22-09'.

Derzeit versuche ich händeringend das Datum als variabel zu setzen, da mir dies einen Strich durch die Rechnung macht.

Meine Derzeite abfrage sieht wie folgt aus:

Code:
SELECT *
FROM dbo.Menschen
WHERE Geboren>'2000-01-01'
and
Month(Geboren) between '03' and '09'

Dabei erreiche ich alle Menschen die zwischen dem März und September geboren wurden, also 01.3 und 31.09. Ich möchte es aber gerne erreichen das ich den Zeitraum zwischen dem 20.3 und dem 22.9 erreiche.

Habt Ihr Ideen wie ich das Problem lösen kann?

Schon einmal vorweg, vielen Dank für die Hilfe!
 
Werbung:
Hrm. Letztendlich willst Du also nur prüfen, ob der 'Tag Des Jahres' dazwischen liegt. In PostgreSQL gibt es für extract() exakt das, doy. (day of year). Du kannst da ein Datum einsetzen und prüfen, ob es zwischen 79 und 265 liegt:

Code:
test=*# select extract('doy' from '2017-03-20'::date);
 date_part
-----------
  79
(1 Zeile)

test=*# select extract('doy' from '2017-09-22'::date);
 date_part
-----------
  265
(1 Zeile)

Aufpassen mußt Du noch, ob es ein Schaltjahr ist, aber das läßt sich auch prüfen. ( PostgreSQL functions to determine if a date is a leap year. Two different functions to demonstrate two different ways. · GitHub )
 
Neben dayofyear gibts natürlich noch jede Menge andere Wege, wenn auch mit mehr Code:
Code:
SELECT *
FROM dbo.Menschen
WHERE Geboren>'2000-01-01'
AND ( datepart(month,Geboren) BETWEEN 4 AND 8
OR datepart(month,Geboren) = 3
AND datepart(day,Geboren) >= 20
OR datepart(month,Geboren) = 9
AND datepart(day,Geboren) <= 22 )
dayofyear könnte bei Schalttagen ein Problem sein, ich weiß aber auch nicht ob sich dann der Definitionszeitraum ändert.

Du solltest auf jedenfall keine Zahlen als Text quoten.
 
Hi,

der Code von Ukulele geht auch etwas kürzer:

Code:
SELECT *
FROM dbo.Menschen
WHERE Geboren>'2000-01-01'
AND  MONTH(Geboren)*100 + DAY(Geboren)   BETWEEN 320 AND 922

Viele Grüße,
Tommi
 
Werbung:
Zurück
Oben