1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Mit dem Jahr aus dem Datum vergleichen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von centauro, 3 August 2014.

  1. centauro

    centauro Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du kennst den Fehler ja scheinbar, falscher Datentyp.
     
  3. akretschmer

    akretschmer Datenbank-Guru

    sie sollte eigentlich gar nicht funktionieren, da ist ein fetter Syntaxfehler.
     
  4. centauro

    centauro Benutzer

    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.
     
  5. centauro

    centauro Benutzer

    Sie funktioniert aber. ;-)

    Wo soll denn der Syntaxfehler sein?
    Ich vermute mal das Du die WHERE Klausel mit DATE_FORMAT(.....) meinst, oder?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    "kunde, FROM" -> das Komma vor dem FROM.
     
  7. akretschmer

    akretschmer Datenbank-Guru

    Wird wohl an den Datensätzen liegen. Shit in, Shit out.
     
  8. centauro

    centauro Benutzer

    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.
     
  9. centauro

    centauro Benutzer

    Dennoch danke für Deine Hilfe.
     
  10. akretschmer

    akretschmer Datenbank-Guru

    noch einer.
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Das ist übrigens auch falsch: "AND DATE_FORMAT(Zahlungsziel, '%Y')=2014" , die Funktion date_format() liefert IIRC einen Text / String whatever, Du vergleichst mit einem INT.
     
  12. Walter

    Walter Administrator Mitarbeiter

    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%'")?
     
    akretschmer gefällt das.
  13. BerndB

    BerndB Datenbank-Guru

    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
     
  14. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden