SQL - Abfrage von Monat und Jahr?

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.

dietmar1204 
Fragesteller
 09.06.2021, 13:30

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

0
TheFamousSpy  09.06.2021, 13:45
@dietmar1204

In sql machst du "and" nicht mit "&&" sondern schreibst einfach nur "and" hin. Dein Query ist also falsch.

0
ohwehohach  09.06.2021, 13:46
@dietmar1204

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
0
showgirl1  09.06.2021, 14:20
@ohwehohach

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.

0
ohwehohach  09.06.2021, 14:23
@showgirl1

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.

0
ohwehohach  09.06.2021, 14:26
@showgirl1

Wenn Du willst, kannst Du sogar das von MySQL machen lassen:

... WHERE Datum BETWEEN @erster AND DATE_ADD(@erster, INTERVAL 1 MONTH); 
0

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
dietmar1204 
Fragesteller
 09.06.2021, 13:37

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

0