Jump to content

SQL Query - Geburtstagsliste funktioniert nicht im Februar


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo,

 

ich habe folgendes Problem. Ich habe eine SQL-Abfrage, die eigentlich die kommenden Geburtstage anzeigen soll. Tut sie auch. Das ganze Jahr. Nur im Februar fehlen immer die Geburtstagskinder des aktuellen Tages.

 

Somit muss es wohl am Februar mit seinen 28/29 Tagen sein.

 

Wo ist der Fehler in der Abfrage?

 

SELECT KUNDE.VNAME, KUNDE.STATUS, KUNDE.VN_GEBURT,
       CASE
         WHEN ((EXTRACT(MONTH FROM VN_GEBURT) = 2) AND (EXTRACT(DAY FROM VN_GEBURT) = 29) AND ((59 = EXTRACT(YEARDAY FROM CAST((EXTRACT(YEAR FROM CURRENT_DATE) || '-3-1') AS TIMESTAMP))))) THEN CAST('01.03.' || EXTRACT(YEAR FROM CURRENT_DATE) AS DATE)
         WHEN ((EXTRACT(MONTH FROM VN_GEBURT) >= EXTRACT(MONTH FROM CURRENT_DATE))) THEN CAST(EXTRACT(DAY FROM VN_GEBURT) || '.' || EXTRACT(MONTH FROM VN_GEBURT) || '.' || EXTRACT(YEAR FROM CURRENT_DATE) AS DATE)

         ELSE CAST(EXTRACT(DAY FROM VN_GEBURT) || '.' || EXTRACT(MONTH FROM VN_GEBURT) || '.' || EXTRACT(YEAR FROM DATEADD(1 YEAR TO CURRENT_DATE)) AS DATE)
       END AS GEBURTSTAG,

       FLOOR(DATEDIFF(DAY FROM VN_GEBURT TO CURRENT_DATE + 30) / 365.25) AS KOMMENDES_ALTER,

       (FLOOR(DATEDIFF(DAY FROM VN_GEBURT TO CURRENT_DATE + 30) / 365.25)) - (FLOOR(DATEDIFF(DAY FROM VN_GEBURT TO CURRENT_DATE) / 365.25)),
       KUNDE.AMSIDNR
FROM "KUNDE"
WHERE ((1 = (FLOOR(DATEDIFF(DAY FROM VN_GEBURT TO CURRENT_DATE + 30) / 365.25)) - (FLOOR(DATEDIFF(DAY FROM VN_GEBURT TO CURRENT_DATE) / 365.25))) OR (((EXTRACT(MONTH FROM VN_GEBURT) = 2) AND
      (EXTRACT(DAY FROM VN_GEBURT) = 29) AND
      (CAST('01.03.' || EXTRACT(YEAR FROM CURRENT_DATE) AS DATE) = CURRENT_DATE) AND
      (59 = EXTRACT(YEARDAY FROM CAST((EXTRACT(YEAR FROM CURRENT_DATE) || '-3-1') AS TIMESTAMP))))

      OR (((EXTRACT(MONTH FROM VN_GEBURT) <> 2) AND (EXTRACT(DAY FROM VN_GEBURT) <> 29)) AND (CAST(EXTRACT(DAY FROM VN_GEBURT) || '.' || EXTRACT(MONTH FROM VN_GEBURT) || '.' || EXTRACT(YEAR FROM CURRENT_DATE) AS DATE) = CURRENT_DATE)))) AND
      KUNDE.STATUS IN ('KUNDE', 'INTERESSENT') AND
      KUNDE.IS_HISTORIE = 0 AND
      KUNDE.ZUORDNUNG = 'PRIVAT' AND
      COALESCE(KUNDE.VN_GEBURT, '') <> '' AND
      KUNDE.VN_VERSTORBEN IS NULL
ORDER BY GEBURTSTAG  

Wenn Ihr mir da helfen könntet wäre das echt super. 

 

Vielen Dank im Voraus.

 

Gruß Volker

Link zu diesem Kommentar

Okay ich bin ja keine Oracle/MySQL Spezialist aber das Ganze erscheint mir doch recht umständlich.

Was ist mit den Befehlen EOMONTH (T-SQL) respektive Last_Day(). Damit solltest du das Schaltjahrproblem in den Griff kriegen.

 

Und mit ohne es zu wissen vermute ich mal das es eine wesentlich übersichtlichere Art gibt das Datum zu formatieren statt es zusammenzusetzen.

Mit der Rechnerei wirst du vermutlich Schwierigkeiten haben wenn du nicht mit Ganzzahlen rechnest (365.25)

Link zu diesem Kommentar
vor 4 Minuten schrieb MDD:

Okay ich bin ja keine Oracle/MySQL Spezialist aber das Ganze erscheint mir doch recht umständlich.

Was ist mit den Befehlen EOMONTH (T-SQL) respektive Last_Day(). Damit solltest du das Schaltjahrproblem in den Griff kriegen.

 

Und mit ohne es zu wissen vermute ich mal das es eine wesentlich übersichtlichere Art gibt das Datum zu formatieren statt es zusammenzusetzen.

Mit der Rechnerei wirst du vermutlich Schwierigkeiten haben wenn du nicht mit Ganzzahlen rechnest (365.25)

Das Ding ist, ich habe da ehrlich gesagt keine Ahnung von. Zumindest nicht in der Tiefe. Diese Query hat mein Vorgänger damals geschrieben und jetzt fällt das Problem auf. In zehn Tagen hat es sich von selbst erledigt, aber ich hätte es halt gerne verstanden :)

Link zu diesem Kommentar

habe weder Oracle noch MySQL hier um es auszutesten aber bei mir schaut es im T-SQL so aus. Datum ist noch nicht formatiert. Habe jetzt einfach vom zum heutigen Tag 31 dazugezählt. Womit unter Umständen mehr als 1 Monat angezeigt wird

 

SELECT cast(gebdatum AS DATE) geborenAm
	,Vorname
	,Nachname
	,year(getdate()) - year(gebdatum) as NeuAlter 
	,dateadd(year, year(getdate()) - year(gebdatum), gebdatum) NaechsterGeburtstag
FROM T_Mitarbeiter
WHERE 
	 dateadd(year, year(getdate()) - year(gebdatum), gebdatum) BETWEEN cast(getdate() AS DATE) AND cast(dateadd(DAY, 31, getdate()) AS DATE)
ORDER BY 5

Heutiger Tag und 28. Februar wurden richtig berücksichtigt.
 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...