Mit dem Jahr aus dem Datum vergleichen

centauro

Benutzer
Beiträge
5
Hallo liebe Forengemeinde,

ich habe kleine Schwierigkeiten mit meiner SQL-Abfrage.

Ausgangslogik:
In einer meiner Tabellen steckt ein Datumsfeld mit deutschem Format als "Varchar".

Nun möchte ich gerne mit dem Jahr aus dem Datum vergleichen und mir die Datensätze ausgeben.

Mein Problem:
Die Abfrage liefert lediglich 2 anstatt 147 Datensätze.

Meine Abfrage:
SELECT Rechnungsnummer, Name, Nettobetrag, Mwst, Zahlungsziel, zahlungsstatus, kunde, FROM rechnung WHERE kunde='ABC Corp.' AND zahlungsstatus='Bezahlt' AND DATE_FORMAT(Zahlungsziel, '%Y')=2014

Leider Funktioniet diese Abfrage nur bedingt, da sie nur 2 Datensätze zurück liefert, jedoch über 100 zurück liefern soll.

Wo steckt hier der Fehler?

Vorab vielen Dank für Eure Hilfe.

Viele Grüße
 
Werbung:
Meine Abfrage:
SELECT Rechnungsnummer, Name, Nettobetrag, Mwst, Zahlungsziel, zahlungsstatus, kunde, FROM rechnung WHERE kunde='ABC Corp.' AND zahlungsstatus='Bezahlt' AND DATE_FORMAT(Zahlungsziel, '%Y')=2014

Leider Funktioniet diese Abfrage nur bedingt,

sie sollte eigentlich gar nicht funktionieren, da ist ein fetter Syntaxfehler.
 
Ich weiß, es ist ein varchar Feld und müsste eigentlich ein Datumsfeld sein.
Gibt es keine andere Möglichkeit? Denn es werden ja immerhin 2 Datensätze angezeigt. Es sollen aber über 100 angezeigt werden.
 
Sie funktioniert aber. ;-)

Wo soll denn der Syntaxfehler sein?
Ich vermute mal das Du die WHERE Klausel mit DATE_FORMAT(.....) meinst, oder?
 
copy & paste Fehler und ich habe den select etwas verkürzt.
Das weißt Du auch ganz sicher. Wie aber in vielen Foren muss es immer jemanden geben der meckert, meckert und nochmals meckert.
Wir sind hier um uns gegenseitig zu helfen.

Wenn Du mal ganz oben gelesen hättest was ich schrieb, dann hättest Du Deinen Kommentar auch nicht auf die Öffentlichkeit losgelassen mein lieber "akretzschmer".

Aber wie Du schon sagtest.....shit in, shit out.
 
WHERE kunde='ABC Corp.' AND zahlungsstatus='Bezahlt' AND DATE_FORMAT(Zahlungsziel, '%Y')=2014

Wie schon angedeutet, sehe ich da jede Menge Probleme mit den Datentypen. Und Akretschmer ist einzuordnen unter "hart, aber fair" und versucht Dir damit zu helfen.

Ein Datum sollte nicht in einem Textfeld gespeichert werden, ein Status in Textform ("Bezahlt") ist keine gute Idee und das Feld Kunde sieht mir auch nach einem Fehldesign aus (Wahrscheinlichkeit 95%). Vielleicht ist das Kundenfeld sogar der Grund warum Du zu wenig Datensätze bekommst? Schon mal mit LIKE beschäftigt ("WHERE kunde LIKE 'ABC%'")?
 
Hallo,

mal abgesehen von dem Syntax Fehler und dem FULL Table Scan durch die Datums-Funktion
geht das mit der Funktion DATE_FORMAT NICHT

Code:
MariaDB [(none)]> SELECT DATE_FORMAT('1.1.2014', '%y');
+-------------------------------+
| DATE_FORMAT('1.1.2014', '%y') |
+-------------------------------+
| NULL                          |
+-------------------------------+
1 row in set, 1 warning (0.00 sec)

MariaDB [(none)]> SELECT DATE_FORMAT('2014-01-01', '%Y');
+---------------------------------+
| DATE_FORMAT('2014-01-01', '%Y') |
+---------------------------------+
| 2014                            |
+---------------------------------+
1 row in set (0.00 sec)

Wie du sehen kannst liefert diese Funktion ein NULL zurück wenn du einen deutschen Datumsstring verwendest.

Du kannst das aber mit:

Code:
MariaDB [(none)]> SELECT SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) ;
+-------------------------------------------+
| SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) |
+-------------------------------------------+
| 2014                                      |
+-------------------------------------------+
1 row in set (0.00 sec)

SUBSTRING_INDEX machen. Zum vergleich kannst du eine Zahl nehmen

Code:
Gruss

Bernd
MariaDB [(none)]> SELECT SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) >2013;
+-------------------------------------------------+
| SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) >2013 |
+-------------------------------------------------+
|                                               1 |
+-------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> SELECT SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) >2014;
+-------------------------------------------------+
| SUBSTRING_INDEX( '15.11.2014' , '.', -1 ) >2014 |
+-------------------------------------------------+
|                                               0 |
+-------------------------------------------------+
1 row in set (0.00 sec)


Gruss

Bernd
 
Werbung:
Eigentlich kann man nur sagen mit einem Datumsfeld in das jeder etwas rein schreiben kann wird man keine vernünftige Abfrage aufbauen können. Wenn das "deutsche Datumsformat" durch das Frontend erzwungen wird kann man es immerhin noch zerlegen und konvertieren, oder man repariert gleich das Frontend und stellt auf DATE oder DATETIME um.
 
Zurück
Oben