Zur Navigation

Formular absenden und Geburtstag auslesen [3]

21 tobi

OK, danke für den Tipp.

Leider werden dadurch auch keiner Geburtstagskinder aufgezeigt

25.11.2010 22:47

22 Jörg Kruse

OK, das Array wird wohl auch nur für den Inhalt von $Betreff benötigt - welches jetzt aber auch den Folgemonat anzeigen sollte?

Für die Auswahl der Geburtstagskinder muss die betreffende Query bearbeitet werden. Da wird wohl noch das Jahr benötigt, damit BETWEEN ein vernünftiges Ergebnis liefert. Probier's mal mit diesem WHERE Statement:

            WHERE DATE_FORMAT(geburtsdatum, '%Y%m') BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1) AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)

25.11.2010 23:24

23 tobi

Hi,

ja Dezember und Januar wird nun im Betreff und in der Überschrift angezeigt.

Mit deiner WHERE abfrage werden aber auch keinerlei Geburtstagskinder angezeigt.

MfG

26.11.2010 16:21

24 Jörg Kruse

OK, ich seh schon - das würde eigentlich nur bei denjenigen funktionieren, die in diesem bzw nächsten Jahr geboren werden.

In diesem Ausdruck benötigt man das aktuelle Jahr bzw., falls der Geburtsmonat kleiner als der aktuelle Monat ist, das kommende Jahr:

DATE_FORMAT(geburtsdatum, '%Y%m')

Hiermit sollte es vielleicht funktionieren:

CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))

26.11.2010 19:56 | geändert: 26.11.2010 19:57

25 tobi

Hi,

nun mit folgender sql:

$sql = "
SELECT id, name, vorname, geburtsdatum, (YEAR(CURDATE()) - YEAR(geburtsdatum)) AS `alter`, DAYOFMONTH(geburtsdatum) AS geburtstag, MONTH(geburtsdatum) AS geburtsmonat
FROM geburtstagsliste
WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m'))
ORDER BY geburtsmonat, geburtstag";

werden alle Geburtstag vom Jahr 2010 aufgelistet von 1. Januar bis 31. Dezember.

Nun sollen aber nur Dezember 2010 und Januar 2011 aufgelistet werden.
(und im nächsten Newsletter dann Januar 2011 und Februar 2011, und im übernächsten dann Februar 2011 und März 2011 etc.)

27.11.2010 00:32

26 Jörg Kruse

Dein WHERE Statement ist unvollständig. Du musst den mittels CONCAT() zusammengesetzten Ausdruck noch mit den beiden Zeitpunkten vergleichen (wie in Beitrag 22).

27.11.2010 00:59

27 tobi

WHERE CONCAT(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())), DATE_FORMAT(geburtsdatum, '%m')) BETWEEN PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 1) AND PERIOD_ADD(DATE_FORMAT(CURDATE(), '%Y%m'), 2)

jetzt ist es so, dass Januar und Dezember ausgegeben werden.
Erst Januar und dann Dezember.

Person 1 hat am 31.01. Geburtstag und wird 59 Jahre alt (31.01.1951)
Person 2 hat am 04.12. Geburtstag und wird 52 Jahre alt (04.12.1958)

Eigentlch sollte ja in diesem Fall, Dezember vor Januar kommen und auch bei Person 1 60 Jahre stehn und nicht 59.

27.11.2010 01:06

28 Jörg Kruse

Eigentlch sollte ja in diesem Fall, Dezember vor Januar kommen

Das kannst du erreichen, indem du im ORDER BY Statement zuerst noch nach dem Jahr sortierst.

und auch bei Person 1 60 Jahre stehn und nicht 59.

Berechnet wird hier, wie alt der User in diesem Jahr geworden ist:

(YEAR(CURDATE()) - YEAR(geburtsdatum)) AS `alter`

Also muss auch hier noch der Jahreswechsel berücksichtigt werden, z.B. so:

(IF(MONTH(geburtsdatum) < MONTH(CURDATE()), YEAR(CURDATE()) + 1, YEAR(CURDATE())) - YEAR(geburtsdatum)) AS `alter`

27.11.2010 12:48

29 tobi

Zitat von Jörg
Eigentlch sollte ja in diesem Fall, Dezember vor Januar kommen

Das kannst du erreichen, indem du im ORDER BY Statement zuerst noch nach dem Jahr sortierst.

und wie sollte dass dann aussehen?
ORDER BY YEAR, geburtsmonat, geburtstag";

27.11.2010 15:19