Geburtsdatum-vergleich

Ascon

Benutzer
Beiträge
7
hi @ll,

ich, ein mysql Anfänger, bräuchte bitte Hilfe :)
habe ein Python Programm geschrieben, welches Adressen, Geburts Datum, Handynr. etc in die mysql Datenbank speichert,
soweit klappt auch alles, bis auf, die Geburtstags abfrage.
In der DB sind die Geburtstage im Format 'date' gespeichert. (JJJJ-MM-TT), ich schaffe es nicht, das er mir nur die Monate und tage abgleicht. zb. 19.03 == 19.03.1980
Das ganze funktioniert bei mir nur wenn das datum mit dem in der Datenbank übereinstimmt, was aber wenig Sinn macht, weil der 19.03.1980 nicht wieder kommen wird, kurz um, speicher ich den 7.04.2014, zeigt er mir an das der Eintrag heute Geburtstag hat :(

hier mal der code für die Funktion:
Code:
def geb_eintrag(db): # zeigt den kontakt an, welcher Geburtstag hat
    cur = db.cursor()
    cur.execute('''SELECT Name, Nachname, Telefon, Geburtstag FROM Anschrift where Geburtstag = CURRENT_DATE''')
    numrows = int(cur.rowcount)
    for i in range(numrows):
        row = cur.fetchone()
        print 'Geburtstag hat:', row[0],
        print row[1],
        print row[2],
        print row[3]

ich hoffe ich konnte mein Problem verständlich schildern, wenn noch infos von nöten sind bitte melden :)

Danke und Gruß
Ascon
 
Werbung:
In der DB sind die Geburtstage im Format 'date' gespeichert. (JJJJ-MM-TT), ich schaffe es nicht, das er mir nur die Monate und tage abgleicht. zb. 19.03 == 19.03.1980

Dazu gibt es Funktionen wie to_char(), mit denen Du ein Datum formatieren und damit vergleichen kann.

Code:
test=*# select to_char(current_date,'mm.dd');
 to_char
---------
 04.07
(1 row)

Bin mir jetzt aber nicht sicher, ob MySQL das kann - vieles kann es ja nicht, obiges ist PostgreSQL. Schau einfach in die Doku, was es gibt.
 
ok, danke dir werds testen ;)

Um zu schauen, wer die nächsten N Tage Geburtstag hat, kann man übrigens auch mit dem Alter der Leute arbeiten, es scheint da ein Zusammenhang zu bestehen, daß man da immer 1 Jahr älter wird ;-)

Also, angenommen, jemand hat am 2010-04-10 Geburtstag, dann sieht man das so:

Code:
test=*# select extract(year from age(current_date, '2010-04-10'::date)), extract(year from age(current_date+10, '2010-04-10'::date));
 date_part | date_part
-----------+-----------
  3 |  4
(1 row)

Man sollte nun für den Kindergeburtstag planen ;-)
 
Ich vermute du suchst das hier:
Code:
mysql> SELECT
EXTRACT(MONTH FROM NOW()) AS Monat1,
MONTH(NOW()) AS Monat2,
EXTRACT(DAY FROM NOW()) AS Tag1,
DAYOFMONTH(NOW()) AS Tag2;
+--------+--------+------+------+
| Monat1 | Monat2 | Tag1 | Tag2 |
+--------+--------+------+------+
|      4 |      4 |    7 |    7 |
+--------+--------+------+------+
1 row in set (0.00 sec)
 
Ich vermute du suchst das hier:
Code:
mysql> SELECT
EXTRACT(MONTH FROM NOW()) AS Monat1,
MONTH(NOW()) AS Monat2,
EXTRACT(DAY FROM NOW()) AS Tag1,
DAYOFMONTH(NOW()) AS Tag2;
+--------+--------+------+------+
| Monat1 | Monat2 | Tag1 | Tag2 |
+--------+--------+------+------+
|      4 |      4 |    7 |    7 |
+--------+--------+------+------+
1 row in set (0.00 sec)


Mahlzeit,

ich denke ich habe den Ansatz verstanden, leider bekomme ich eine Fehler meldung:
Code:
mysql> SELECT EXTRACT(MONTH FROM Geburtstag) AS Monat1,
MONTH(NOW()) AS Monat2, EXTRACT(DAY FROM NOW()) AS Tag1,
DAYOFMONTH(NOW()) AS Tag2;
ERROR 1054 (42S22): Unknown column 'Geburtstag' in 'field list'

Code:
mysql> explain Anschrift;
+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| Anschrift_ID | int(11)      | NO   | PRI | NULL    | auto_increment |
| Name         | varchar(80)  | YES  |     | NULL    |                |
| Nachname     | varchar(80)  | YES  |     | NULL    |                |
| Straße       | varchar(80)  | YES  |     | NULL    |                |
| PLZ          | varchar(10)  | YES  |     | NULL    |                |
| Ort          | varchar(120) | YES  |     | NULL    |                |
| Telefon      | varchar(30)  | YES  |     | NULL    |                |
| Handy        | varchar(30)  | YES  |     | NULL    |                |
| email        | varchar(50)  | YES  |     | NULL    |                |
| Geburtstag   | date         | YES  |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+
10 rows in set (0.00 sec)
 
Das hängt für gewöhnlich davon ab, wie die Tabelle definiert wurde. Wurden da die Attributnamen in Backticks bzw. Hochkommata notiert sind diese später nötig. Ansonsten geht es normalerweise ohne und ohne Berücksichtigung der Groß/Kleinschreibung.
 
Mahlzeit,

ich denke ich habe den Ansatz verstanden, leider bekomme ich eine Fehler meldung:
Code:
mysql> SELECT EXTRACT(MONTH FROM Geburtstag) AS Monat1,
MONTH(NOW()) AS Monat2, EXTRACT(DAY FROM NOW()) AS Tag1,
DAYOFMONTH(NOW()) AS Tag2;
ERROR 1054 (42S22): Unknown column 'Geburtstag' in 'field list'

In dieser Abfrage werden alle Spalten unbekannt sein, da Du keine Tabelle angegeben hast.
 
Zuletzt bearbeitet von einem Moderator:
ich bekomms nicht hin :(

was ist in der syntax falsch das ich nicht eine solche ausgabe bekomme?:
Code:
Heute hat: Stefan, Mayer, 017*******, 19.3.1980 Geburtstag

Code:
SELECT 'Name', 'Nachname', 'Telefon', 'Geburtstag' FROM Anschrift
where EXTRACT(MONTH('Geburtstag')) AS monat
EXTRACT(DAYOFMONTH('Geburtstag')) AS Tag
EXTRACT(MONTH(NOW()) AS Monat2
EXTRACT(DAYOFMONTH(NOW()) AS Tag2, Monat Tag = Monat2 Tag2;

ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near '('Geburtstag')) AS monat
EXTRACT(DAYOFMONTH('Geburtstag')) AS Tag  EXTRACT(MONTH' at line 1
 
ich bekomms nicht hin :(

was ist in der syntax falsch das ich nicht eine solche ausgabe bekomme?:
Code:
Heute hat: Stefan, Mayer, 017*******, 19.3.198 Geburtstag

Code:
SELECT 'Name', 'Nachname', 'Telefon', 'Geburtstag' FROM Anschrift where EXTRACT(MONTH('Geburtstag')) AS monat EXTRACT(DAYOFMONTH('Geburtstag')) AS Tag  EXTRACT(MONTH(NOW()) AS Monat2 EXTRACT(DAYOFMONTH(NOW()) AS Tag2, Monat Tag = Monat2 Tag2;

Meine Glaskugel ist grad defekt, daher sehe ich die Fehlermeldung da grad nicht, die Du uns hereimlichst. Aber ich vermute es mal im Dunstkreis von:

Code:
EXTRACT(MONTH('Geburtstag')) AS monat EXTRACT(DAYOFMONTH('Geburtstag')) AS Tag
 
Die WHERE Bedingung muss schon aus Wahrheitswerten bestehen also z.B. Monat = 1 und nicht Monat AS Alias. Das zeigt Null Verständniss für den Code deinerseits :(
Code:
SELECT 'Name', 'Nachname', 'Telefon', 'Geburtstag' FROM Anschrift
WHERE    EXTRACT(MONTH('Geburtstag')) = EXTRACT(MONTH(NOW())
AND        EXTRACT(DAYOFMONTH('Geburtstag')) = EXTRACT(DAYOFMONTH(NOW())
Wobei ich nicht glaube das MySQL die in Hochstrichen gesetzten Spaltennamen auch als Spalten behandelt... ist das nicht normalerweise ein ` Strich?
 
danke euch für die Hilfe :)

bin ein stück weiter:
Code:
SELECT 'Name', 'Geburtstag' from Anschrift WHERE
EXTRACT(DAY FROM 'Geburtstag') =
EXTRACT(DAY FROM SYSDATE()) and 
EXTRACT(MONTH FROM 'Geburtstag') =
EXTRACT(MONTH FROM SYSDATE());

Empty set, 2 warnings (0.00 sec)

kann es sein das es an dem Datum selber liegt?
Gespeichert werden sie so '1980-04-09'
 
Werbung:
Zurück
Oben