Ankündigung

Einklappen
Keine Ankündigung bisher.

MarieDB Select mit between

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MarieDB Select mit between

    Hallo Zusammen

    ich habe von MYSQL nach MarieDB umgebaut.

    Ganz einfache Abfrage die unter MYSQL funktioniert und die gültigkeit eines Datensatzes prüft
    PHP-Code:
    SELECT id kommentar
    FROM tbl_kommentar
    WHERE 
    '2018-08-13' BETWEEN valid_from AND valid_util 
    Wenn ich diese Abfrage auf die MarieDB ausführe bekomme ich keinen Datensatz zurück, aber auch keine Fehlermeldung.

    Bei dem Statment
    PHP-Code:
    SELECT id kommentar
    FROM tbl_kommentar
    WHERE valid_from 
    '2018-8-14'
    AND valid_util >  '2018-08-14' 
    ist die Welt in Ordnung

    ist das ein Back von MarieDB oder fehlt mir was?

    Gruß Jörg


  • #2
    1. Heißt es MariaDB und nicht MarieDB.

    2. Poste bitte ein nachvollziehbares Beispiel als SQL-Code inklusive Tabellenstruktur und Testdaten. Am besten du erstellst eines auf SQL Fiddle.

    Kommentar


    • #3
      Deine Rechtschreibung ist schlecht, daher denke ich das valid_util wohl eher valid_until heissen muss.
      Mysql Fehler kann man sich auch anzeigen lassen.

      ist das ein Back von MarieDB
      Was ist denn ein Back in deiner Welt?

      Kommentar


      • #4
        Hallo Zusammen,

        Danke für die konstruktiven Anmerkungen

        natürlich ist es eine MariaDB
        Back = bug -> Fehler
        und von mir aus auch valid_until

        aber das ist nicht wirklichen die Antwort auf meine Frage.
        Gruß Jörg

        PS:Wer einen Rechtschreibfehler findet darf hin behalten.

        Kommentar


        • #5
          Wo bleibt jetzt das vollständige Beispiel als SQL-Code? Das hast du irgendwie gekonnt überlesen.

          Kommentar


          • #6
            ... vielleicht kann er das gar nicht, also 'gekonnt lesen'? Frag ja nur ...
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Commu deine beiden SQL Ausdrücke sind nicht equivalent.
              Zum einen ist ein anderes Datum als Referenz angeben, zum Anderen entspricht eine Suche mit "x BETWEEN a AND b" dem Ausdruck "x >= a AND x <= b" und nicht "x > a AND x < b"

              Probiere deinen Fall also Mal mit equivalenten SQL Staments aus!

              Sofern die Felder valid_from und valid_until nicht vom Typ DATE oder einem VARCHAR/CHAR Typ sind sondern DATETIME oder TIMESTAMP , wirst du hier wohl auch Opfer des TypeCastings.
              Es wird dann intern die Uhrzeit "00:00:00" angefügtH, was zu scheinbar falschen Ergebnissen führen kann. Hier solltest du dann ein explizites TypeCasting vornehmen, bzw. Deinen Schwert als DATETIME und nicht als DATE angeben.

              MariaDB hat je nach Konfiguration intern u.U. ein anderes Format für TIMESTAMP. So werden dann zum Beispiel auch Bruchteile von Sekunden unterstützt. Es ist zwar unwahrscheinlich, aber auch das könnte eine Ursache sein.

              Kommentar


              • #8
                Meine Tabelle:
                PHP-Code:
                CREATE TABLE IF NOT EXISTS `tbl_kommentar` (
                  `
                idint(11NOT NULL AUTO_INCREMENT,
                  `
                datumdate NOT NULL,
                  `
                fachbereichchar(15COLLATE latin1_german2_ci NOT NULL,
                  `
                aufwandfloat(2,2NOT NULL,
                  `
                kommentarvarchar(5000COLLATE latin1_german2_ci NOT NULL,
                  `
                valid_fromdate NOT NULL,
                  `
                valid_untildate NOT NULL DEFAULT '3500-12-31',
                  
                PRIMARY KEY (`id`)
                ENGINE=MyISAM AUTO_INCREMENT=DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
                ich gebe dir Recht das der Ausdruck "x >= a AND x <= b" nicht gleich "x > a AND x < b" ist.
                für mich ist es aber genung wenn der "Timestap auf " 00:00:00 für die Spalte steht.

                In meiner Abfrage setze ich eine Variable $now ein. Soviel ich weiß werden die Zeit in der DB-Engine eh in Sekunden abgelegt / abgefragt, es gibt den unterschied in der Darstellung TypeCasting. wenn ich also davon ausgehe das der Wert Datenbank intern in Sekunden steht dann ist '<' oder '<=' im Wert max 1 Sekunde mehr bzw. weniger.

                Bevor ich die Abfrage starte setze ich $now. z.B.
                PHP-Code:
                 $now 2018-08-15 11:30:24 
                wenn ich nun das Select absetze habe den gleichen Wert in der Abfrage.

                PHP-Code:
                $sql "SELECT id , kommentar
                FROM tbl_kommentar
                WHERE valid_until > '"
                .$now."'
                AND valid_from < '"
                .$now."'"
                Mir ging es aber nicht um die Schreibweise der Statments, weil ich trotz unterschiedlicher Datumschreibweise 2018-8-14 oder 2018-08-14 das gleiche Ergebnis erziele.
                Vielmehr habe ich bei BETWEEN eine leere Ausgabe und bei < > bekomme ich die Datensätze angezeigt.

                Ist das also das Problem vom TypeCasting?

                Gruß Jörg

                Kommentar


                • #9
                  für mich ist es aber genung wenn der "Timestap auf " 00:00:00 für die Spalte steht
                  Als Info..
                  0000-00-00 00:00:00 ist kein gültiger Wert. Dafür gibt es NULL.
                  The string "()()" is not palindrom but the String "())(" is.

                  Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                  PHP.de Wissenssammlung | Kein Support per PN

                  Kommentar


                  • #10
                    Gib $sql mal testweise aus und Teste das mit einem Tool wie HeidiSQL. Bei mir funktioniert das mit BETWEEN, aber mit valid_until. (MariaDB server Version 5.5.5-10.1.2 )
                    Zitat von Commu Beitrag anzeigen

                    und von mir aus auch valid_until
                    Du solltest schon die richtigen Spaltennamen benutzen!

                    Und diese Zeile
                    PHP-Code:
                    $now 2018-08-15 11:30:24 
                    steht so bestimmt nicht im Quelltext.

                    Kommentar


                    • #11
                      Diese Zeile ist falsch.
                      PHP-Code:
                      ENGINE=MyISAM AUTO_INCREMENT=DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
                      engine sollte innoDB sein und latin1_german2_ci funktioniert nicht mit Datumswerten, das geht in die Hose, besser den default nehmen und nur die Spalte auf die deutsche Kollation setzen, die man auch auf deutsch sortiert haben will.
                      Der Zeichensatz ist auch besser mit utf8 angegeben anstatt latin1, da es sonst wieder Probleme mit den Umlauten geben kann.

                      Kommentar


                      • #12
                        Na hier geht's ja mal wieder Herz erwärmend zu!

                        Zitat von Commu Beitrag anzeigen
                        ..
                        aber das ist nicht wirklichen die Antwort auf meine Frage.
                        ..
                        PS:Wer einen Rechtschreibfehler findet darf hin behalten.
                        Commu
                        Ich bin selber kein Spezialist für Rechtschreibung, aber:
                        Wir sind hier nicht bei Knuddels oder fakebook. In solchen technischen Foren wie hier ist es hilfreich, mindestens Fachbegriffe richtig zu schreiben. Es erleichtert allen Beteiligten -Dir und denen, die Du um Hilfe ersuchst- das Problem zu erkennen und den richtigen Rat zu geben.
                        Darüber hinaus helfen die richtigen Begriffe in korrekter Schreibweise schon beim Suchen im Internet- lange bevor man z.B. hier neue Threads eröffnet. Je präziser man die Suchbegriffe wählt, desto weiter oben stehen die richtigen Antworten. Und: "Meintest Du vielleicht .." und ähnliche tolle Features kann google natürlich aus seinem Statistikärmel schütteln. Hier aber lesen echte Menschen oder eben auch nicht, wenn man die Fragestellung erstmal in 15 posts klären muss.
                        Du tust letztlich Dir selbst den größten Gefallen, wenn Du die joviale Nummer mit "wer Rechtschreibfehler findet.." in derartigen Foren einfach beiseite lässt und möglichst präzise und konzentriert das Problem schilderst. Dabei darf man gern auch Rückfragen beantworten oder antworten, warum man bestimmte Rückfragen für irrelevant hält.

                        Oder ganz anders formuliert:
                        Man könnte sich auch mal die Frage stellen, warum man einem seelenlosen Blechkasten gegenüber korrekte Programmiersprache verwendet, einem Menschen gegenüber, von dem man sich Hilfe erwartet, aber keine zumindest erkennbare Mühe in der Commu-nikation an den Tag legt.

                        Kommentar


                        • #13
                          danke hat sich erledigt

                          Kommentar

                          Lädt...
                          X