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!

Recommended Posts

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 to post

Also die Selektion soll alle kommenden Geburtstage inklusive heute anzeigen.

 

Leider zeigt er die kommenden Geburtstage an, aber OHNE heute. Wenn ich das Datum aber manuell auf März ändere, dann funktioniert es wieder.

 

Systemdatum 19.02.2021

 

image.png.66d8cbe8dbb9a9c1f6e2ec5fb1aa47ac.png

 

Systemdatum 16.03.2021:

 

image.png.a7723798ac5f571bbff30cc4d2b7f2e1.png

Link to post

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 to post
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 to post

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 to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...