SQL - Abfrage von Monat und Jahr?
Hallo,
ich habe eine Textbox, in der man das Jahr und Monat eingibt, um dann alle Einträge in dem Monat zu suchen.
YYYY-MM
Wie kann ich jetzt die Datenbank genau nach dem Jahr & Monat suchen lassen?
2 Antworten
Kommt darauf an, welchen Datentyp die Spalte hat. Wenn es eine Zeichenkette ist, und da direkt YYYY-MM drinsteht, dann kannst Du direkt suchen mit
... WHERE Datum = @<Wert aus Programm>
Wobei Du natürlich bitte entsprechend der Programmiersprache und des Datenbanksystems mit prepared Statements arbeitest, um SQL-Injection zu vermeiden.
In sql machst du "and" nicht mit "&&" sondern schreibst einfach nur "and" hin. Dein Query ist also falsch.
Naja, ein Date ist eben kein String. Also müssen die Anführungszeichen schon mal weg im SQL-Statement. Außerdem heißt es in SQL AND und nicht &&. Weiterhin: Ungefilterte Eingabe? Schwierig. Lieber ein prepared Statement.
Ich würde außerdem wiefolgt vorgehen: Ich würde in PHP aus der Eingabe zwei Datumswerte erzeugen - nämlich den ersten des entsprechenden Monats und den ersten des Folgemonats. Dann würde ich die Abfrage in SQL mit BETWEEN machen:
... WHERE Datum BETWEEN @erster AND @letzter
Date (YYYY-MM-DD) ist ein String, da mySQL dir das sonst ausrechnet da Minuszeichen enthalten. In diesem Fall ist BETWEEN ungeeignet, da dadurch vorher der letzte des Monats ermittelt werden muss - diese Fehlerquelle kann man sich schon sparen.
Nein. Ein Date ist intern sogar ein Double. Wenn Du eine Abfrage machst wie
WHERE Date = '2021-06-09'
erfolgt intern implizit eine Konvertierung des Strings in ein Date. Dass das so ist, sieht man schön auch daran, dass bei einem SELECT die Ausgabe von Datumswerten anhand der Spracheinstellung der DB formatiert wird. Das wäre bei Strings gar nicht möglich.
Und genau aus diesem Grund schafft obiges auch echt schlimme Probleme, wenn man plötzlich die Spracheinstellung ändert. Dann ist nämlich je nach locale mit '2021-06-09' entweder der 09. Juni 2021 oder der 06. September 2021 gemeint.
Und daher sollte man wann immer möglich vermeiden, ein Datum mit einem String zu vergleichen (oder zumindest explizit den String unter Angabe des Locale in einen Date wandeln).
Und es muss auch nicht der Letzte des Monats, sondern der erste des Folgemonats ermittelt werden. Mit den eingebauten Datumsfunktionen in PHP ist das überhaupt kein Problem und auch keine Fehlerquelle - zumindest keine größere, als Date und String zu vergleichen.
Wenn Du willst, kannst Du sogar das von MySQL machen lassen:
... WHERE Datum BETWEEN @erster AND DATE_ADD(@erster, INTERVAL 1 MONTH);
Month und Year könntest Du extrahieren und mit den ensprechenden funktionen nutzen
https://www.w3resource.com/mysql/date-and-time-functions/mysql-month-function.php
SELECT *
FROM tabelle
WHERE YEAR(datumsfeld) = 2012 AND MONTH(datumsfeld) = 5
Für die Funktion benötige ich dann noch eine zusätzliche Textbox, weil wenn ich in Textbox1 = 2012.05 eingebe, dann übernimmt er den Wert auch für den Monat
Spalte hat Date als Typ. Datum wird per NOW gespeichert. YYYY-MM-DD. Programmiersprache PHP. Der Nutzer soll per Eintrag: 2021-06 das Jahr und den Monat gefiltert bekommen.
SELECT * FROM daten Where Month(Datum)='$tb1' && YEAR(date)='tb2'; hat z.B. nicht funktioniert. Ich vermute, dass durch den Dash in der Eingabe ebenfalls ein Problem entsteht