Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
grafzahl
Threadersteller
Dabei seit: 13.04.2006
Ort: Magdeburg
Alter: 39
Geschlecht:
|
Verfasst Do 01.03.2007 14:46
Titel [solved][MySQL] neue/alte Geburtstage ermitteln. |
|
|
Hi Leute, ich hab bereits kurz nach einer eventuellen Lösung gesucht, bin jedoch nicht wirklich fündig gewurden.
Leider kenne ich mich mit den Datenfunktionen unter MySQL auch nicht wirklich aus.
Folgende Aufgabenstellung: Aus einer Datenbank sollen immer die Mitglieder ausgegeben werden die in den nächsten 5 Tagen Geburtstag haben und die, die in den letzten 5 Tagen Geburtstag hatten. Die Daten liegen im typischen MySQL-Data-Format in der Datenbank, also z.B. 1972-09-05 00:00:00
Wie ist es möglich diese Werte sicher zu ermitteln, ich hatte schon einen Lösungsansatz, jedoch weis ich nicht wie ich die 5 Tage abziehen, bzw. aufstocken kann und vor allem gabs das Problem beim Jahreswechsel, da wurde durch die DAYOFYEAR-Anweisung nicht weiter gerechnet.
Hat da evtl. n Lösungsansatz?
Zuletzt bearbeitet von grafzahl am So 04.03.2007 10:55, insgesamt 1-mal bearbeitet
|
|
|
|
|
beeviZ
Dabei seit: 30.09.2002
Ort: -
Alter: -
Geschlecht:
|
Verfasst Do 01.03.2007 14:51
Titel
|
|
|
speichere die Timestamps der Geburtstage ab, und mach dann n select
WHERE bday > time()-60*60*24*5 OR bday < time()+60*60*24*5.
//edit:
was n bullshit
Zuletzt bearbeitet von beeviZ am Do 01.03.2007 15:22, insgesamt 2-mal bearbeitet
|
|
|
|
|
Anzeige
|
|
|
Skyw4lker
Dabei seit: 30.08.2004
Ort: Bergisch Gladbach
Alter: 43
Geschlecht:
|
Verfasst Do 01.03.2007 14:52
Titel
|
|
|
Code: | DATE_ADD(date,INTERVAL expr unit), DATE_SUB(date,INTERVAL expr unit) |
klick
du baust dir nen select und machst in der where bedingung ziehst du vom aktuellen datum
einmal 5 tage ab, dann ein AND und dann tust du 5 tage drauf.
Dann also where bday > heute - 5 tage AND bday < heute + 5 tage (prosa)
// das mit dem jahr hatte ich nicht bedacht, ich probier mal eben was aus
Zuletzt bearbeitet von Skyw4lker am Do 01.03.2007 15:00, insgesamt 3-mal bearbeitet
|
|
|
|
|
grafzahl
Threadersteller
Dabei seit: 13.04.2006
Ort: Magdeburg
Alter: 39
Geschlecht:
|
Verfasst Do 01.03.2007 15:14
Titel
|
|
|
beeviZ hat geschrieben: | speichere die Timestamps der Geburtstage ab, und mach dann n select
WHERE bday > time()-60*60*24*5 OR bday < time()+60*60*24*5. |
Meinst du n Unixtimestamp? Geht leider nicht da da auch Leute von Anno-sonstwas dabei sind und der Server keine negativen Timestamp unterstützt.
@Skyw4lker: Danke, ich hab mir grad auch was kleines gebastelt das scheinbar sogar ganz gut funktioniert!
Code: |
SELECT id, geburtstag, YEAR(CURRENT_DATE())-YEAR(geburtstag) age, datediff(MAKEDATE(YEAR(CURRENT_DATE())+1,IF(DAYOFYEAR(geburtstag) > DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))),DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))),DAYOFYEAR(geburtstag)) ),CURRENT_DATE()) % DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))) days_to_birthday FROM ordo_mitarbeiter HAVING days_to_birthday < 5 OR days_to_birthday > 361;
|
Da kommt am Ende n Ergebniss mit Geburtstag und Tagen bis zum geburtstag heraus, am Ende schau ich dann halt wer in den nächsten 5 Tagen Geburtstag hat oder bei dem Der Geburtstag halt schon vorbei is und bei dem der nächste Geburtstag somit 351 Tage hin ist.
Aber ich blick durch den Query nicht mehr durch, was kürzeres wär also cool
|
|
|
|
|
Skyw4lker
Dabei seit: 30.08.2004
Ort: Bergisch Gladbach
Alter: 43
Geschlecht:
|
Verfasst Do 01.03.2007 16:12
Titel
|
|
|
Code: | SELECT DATE_ADD(datum, INTERVAL (EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM datum)) YEAR) AS bdays FROM testDatum
WHERE ( DATE_ADD(DATE_ADD(datum, INTERVAL (EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM datum)) YEAR) , INTERVAL 5 DAY) ) >= NOW()
AND ( DATE_SUB(DATE_ADD(datum, INTERVAL (EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM datum)) YEAR) , INTERVAL 5 DAY) ) < NOW()
|
wobei datum deine datumsspalte mit den geburtstagen ist
bei näherem erklärungsbedarf bitte nachfragen
Zuletzt bearbeitet von Skyw4lker am Do 01.03.2007 16:17, insgesamt 2-mal bearbeitet
|
|
|
|
|
grafzahl
Threadersteller
Dabei seit: 13.04.2006
Ort: Magdeburg
Alter: 39
Geschlecht:
|
Verfasst Fr 02.03.2007 13:51
Titel
|
|
|
Danke Skywalker,
ich hab jetzt erstmal mit der Lösung weiterexperimentiert
Code: | SELECT id, geburtstag, YEAR(CURRENT_DATE())-YEAR(geburtstag) age, datediff(MAKEDATE(YEAR(CURRENT_DATE())+1,IF(DAYOFYEAR(geburtstag) > DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))),DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))),DAYOFYEAR(geburtstag)) ),CURRENT_DATE()) % DAYOFYEAR(LAST_DAY(MAKEDATE(YEAR(CURRENT_DATE()), 365))) days_to_birthday FROM ordo_mitarbeiter HAVING days_to_birthday < 5 OR days_to_birthday > 361; |
und dabei einen merkwürdigen Fehler gemerkt. Der Query erstellt ja gleich ein virtuelles Feld das die Tage bis zum Geburtstag ermittelt. Das Klappt soweit auch ganz gut, jedoch rechnet er bei manchen Einträgen einen Tag einfach drauf. Wie ich gemerkt hab wohl bei allen Einträgen die ein gerades Jahr haben. Ist also zb jemand im Jahr 1984 geboren wird ein Tag drauf gerechnet, ist er 1985 oder 1983 geboren passt die Berechnung. Jemand evtl. eine Ahnung woran das liegen könnte? Die Daten liegen also in der Form 1984-03-29 00:00:00 in der Datenbank.
EDIT:
Ok, Problem gelöst, wer mehr wissen möchte -> Hier gibts die Infos!
Zuletzt bearbeitet von grafzahl am So 04.03.2007 10:55, insgesamt 1-mal bearbeitet
|
|
|
|
|
|
|
|
Ähnliche Themen |
[solved] / [PHP/MySQL] Abfrage: Alte Veranstaltungen filtern
MySQL von doppelten Werten den Mittelwert ermitteln
strato und mysql [solved]
[solved] [php/mysql] messenger funktion
[mysql] Nur aus lesen was größer als ... ist [solved]
[solved] / [PHP/MySQL] Ergebnis der Abfrage = 0
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|