Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

SQL Datumseinteilung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Stingrays, 11 Januar 2017.

  1. Stingrays

    Stingrays Neuer Benutzer

    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!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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 )
     
    Stingrays gefällt das.
  3. ukulele

    ukulele Datenbank-Guru

    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.
     
    Stingrays gefällt das.
  4. Tommi

    Tommi Datenbank-Guru

    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
     
    Stingrays gefällt das.
  5. Stingrays

    Stingrays Neuer Benutzer

    Zuerst einmal tausend Dank für euere Hilfe. Ich prüfe es direkt einmal und schaue ob mir das korrekte Ergebnis angezeigt wird.
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden