SQL Befehl nach Geburtsmonat selektieren?
Moin,
ich hab in der Schule ne Aufgabe zu unserer Datenbank bekommen in der ich alle Mitarbeiter der Datenbank auflisten muss, welche im Monat April Geburtstag haben. Dazu soll ich noch Name und Vorname auflisten.
Die Geburtstage in der Spalte "gebtag" sind amerikanisch geschrieben. Also z.B.
1946-10-18, 1952-04-01 oder 1982-03-15.
Da ich ja nur die, wo im April Gebtag haben möchte und das ja dann "04" in der Tabelle wäre, habe ich den Befehl bisher so geschrieben:
SELECT * name, vorname, gebtag FROM 'personal'
WHERE gebtag LIKE '%-04-%'
Die Prozentzeichen stehen ja dafür das dort alles beliebige stehen kann es muss nur der Monat April stehen. Ist dieser Befehl richtig? Wir müssen die Aufgaben auf Papier machen, daheim habe ich kein mysql.
Weiterhin soll ich zusätzlich die Auflistung so anordnen, dass die ältesten Mitarbeiter an erster Stelle stehen. Dafür würde ich folgenden Befehl zu obigem hinzufügen:
ORDER BY gebtag DESC
Wird der Befehl so funktionieren? Ich hoffe ich habe es verständlich rübergebracht. Die Spaltennamen heißen auch so wie ich sie hier in den Befehlen stehen habe.
Ich hoffe hier kann mir jemand helfen
Mit freundlichen Grüßen
Tim
3 Antworten
Designtechnisch ist das meiner Ansicht nach eien Katastrophe. Wer bitteschön schreibt ein Datum als String in eine Datenbank. Da lässt sich doch nicht ordentlich selektieren oder sortieren.
Deine Lösung sollte aber funktionieren.
Ich rate dir aber dennoch, dir irgendetwas zu holen, mitd em du die Abfragen testen kannst.(Ich hätte spontan folgendes gefunden, falls du dir nichts lokal installieren willst: https://www.db4free.net/index.php?language=de)
EDIT:
Ich sehe gerade: Dein SELECT ist so nicht valide. Wie Ceeesy759 sagt musst du dich entweder zwischen einer Liste von Namen oder dem *-Operator entscheiden.
Guter Tipp mit DB Fiddle. In Verbindung mit dem Random Data Generator Mockaroo hat man da schnell etwas zusammengestellt.
Schema_SQL (name der Tabelle muss komischerweise "test" sein, sonst Fehlermeldung):
create table test (
id INT,
name VARCHAR(50),
vorname VARCHAR(50),
gebtag DATE
);
insert into test (id, name, vorname, gebtag) values (1, 'Kenna', 'Castelow', '1994-12-14');
insert into test (id, name, vorname, gebtag) values (2, 'Gui', 'Asaaf', '1971-03-20');
insert into test (id, name, vorname, gebtag) values (3, 'Kalli', 'Hewson', '1960-04-26');
insert into test (id, name, vorname, gebtag) values (4, 'Harlan', 'Morot', '1992-08-04');
insert into test (id, name, vorname, gebtag) values (5, 'Reade', 'Toffts', '2018-04-29');
Query_SQL:
SELECT name, vorname, gebtag FROM test WHERE gebtag LIKE '%-04-%' ORDER BY gebtag ASC;
"Designtechnisch ist das meiner Ansicht nach eien Katastrophe." - Das ist wie im richtige Leben. Da muß man auch mit der Datenbank zurechtkommen, die irgendein Praktikant vor 15 Jahren mal aufgesetzt hat, und die seither am Leben gehalten wird weil niemand mehr genau weiß, was alles dranhängt und zusammenbricht, wenn man mal eine vernünftige Neuimplementation machen würde...
Ist das nicht die Standardausrede, wenn was offensichtlich Mist ist, und es keiner gewesen sein will?
Vielen Dank! Und ja keine Ahnung die Datenbank ist von unserem Lehrer.
Ob die Daten wirklich als STRING vorliegen, wissen wir gar nicht. Es kann durchaus als DATE vorliegen, aber halt in der Ausgabe als YYYY-MM-DD dargestellt werden.
Da der Fragesteller von Lehrer und nicht von Dozent spricht, würde ich hier eher einen Gang zurück schalten 😉
Ja, das kanns ein. Ich frage mich allerdings, warum man eine derartige View definieren sollte.
Da der Fragesteller von Lehrer und nicht von Dozent spricht, würde ich hier eher einen Gang zurück schalten
Anzumerken ist das dennoch. Schon da es ein gewisses Wissen vermittelt und für die Problematik sensibilisiert.
Das hat meiner Einschätzung nach nichts mit der view zu tun. Die view kann genau so ein Datum liefern, welches dann aber für die Darstellung als YYYY-MM-DD angezeigt wird, weil das im entsprechenden Anzeigeprogramm (z. B. PHP-Datenbankabruf) als Standard definiert ist. Und selbst dann weiß man nicht, ob es nun ein DATE oder STRING ist, sondern muss dies gesondert abfragen.
Ja, aber auch hier macht der Ton die Musik. Du beschwerst dich, dass es so nicht filterbar und sortierbar sei. Aber eine Empfehlung, wie man es denn besser macht, lieferst du nicht.
Demotivierend ja, hilfreich nein.
welches dann aber für die Darstellung als YYYY-MM-DD angezeigt wird
Dir ging es also tatsächlich um die Darstellung. Ich hatte angenommen du beziehst dich auf Views, da die Darstellung für die Abfrage selbst ja wenig relevant sein dürfte.
Und selbst dann weiß man nicht, ob es nun ein DATE oder STRING ist, sondern muss dies gesondert abfragen.
Ich verstehe nicht ganz, was du meinst. Im Normalfall weiß man doch, die die Daten in der eigenen Datenbank gespeichert sind.
Ja, aber auch hier macht der Ton die Musik. Du beschwerst dich, dass es so nicht filterbar und sortierbar sei.
Nicht "nicht" sondern nicht undbednint schön. An sich ist das so durchaus filterbar. Würde man eine andere Datumsreprädentation wählen, beispielsweise dd-mm-yyyy, dann wäre es nicht mehr filterbar. An sich finde ich den Fakt unschön, dass das Datum in der Datenbank als String gespeichert wird, statt als Zahl oder Ähnliches.
Aber eine Empfehlung, wie man es denn besser macht, lieferst du nicht.
Das ist korrekt. Ein versäumnis meinerseits.
Demotivierend
Da ich in keinsterweise den Fragesteller Angriff wird es diesen kaum demotivieren. Ich weiß also nicht, auf wen sich diese Aussage deinerseits beziehen soll.
Klingt plausibel. Beim select musst du dich entscheiden
- Alles auswählen mit "SELECT *"
- Nur benötigte Spalten auswählen mit "SELECT name, Vorname, gebtag"
Aber sortiert müsste es ASC (ascending - aufsteigend) sein, denn sonst steht 2020 oben und 1930 unten
Hier kannst Du ein wenig testen: https://www.db-fiddle.com/f/wfC1vCk7T9aquRBsV6G8tD/0
Die Beispieldaten habe ich mit Mockaroo generiert. Dort Format "SQL" nehmen und den Haken "include create table" setzen. Leider Vor- und Nachname vertauscht, ist aber für den Funktiontest nicht so wichtig.
SELECT name
FROM users
WHERE birthday LIKE "%-Geburtsmonat-%".
ISO-Daten lassen sich von je her ordentlich sortieren (Jahr-Monat-Tag, numerisch), das war ja der Hintergrund der Festlegung. Die DIN hatte es ja auch zum einzigen normgerechten numerischen Datum gekürt.
Bis sie merkte: Kannst nem ollen Köter keien neuen Kunststücke mehr beibringen :-D.
An den FS:
Zum Testen kann man auch auf sqlfiddle oder db fiddle o.ä. zurückgreifen.
Und bei solchen Fragen vorzugsweise das Schema dazuliefern, dann weiß man auch, wovon man spricht.