michi: Datum between

Hallo zusammen

Ich habe folgendes Problem.
In einer Datenbank sind die Datumseinträge nach dem Schema "tt.mm.YYYY hh:mm:ss" gespeichert.
Mit PHP mache ich eine Abfrage und konvetiere das Datum auf "tt.mm.YYYY" zusammen. So weit so gut.
Nun möchte ich mit einem kleinen Formular, Datensätze ausweisen welche zwischen zwei bestimmten Daten erstellt wurde und möchte natürlich auch nur Tag, Monate und Jahre eingeben.
Ich habe folgenden Ansatz versucht, kam aber leider zu keine Ergebnis:

$data = mssql_query ("SELECT CONVERT(varchar(10), dbo.tblHistory.CreateDate, 104) AS datum FROM dbo.tblHistory ".
...
...
...
"AND (datum between '$von' and '$bis'");

Hat jemand eine Idee?
Danke schon mal im Voraus.

Gruss
Michi

  1. Ich habe folgenden Ansatz versucht, kam aber leider zu keine Ergebnis:

    "Kein Ergebnis" gibts doch gar nicht.

    Du hast Erwartungen an den Code, den du geschrieben hast. Welche sind das?

    Außerdem liefert dein Code irgendwas. Was ist das?

    Und das Lieferergebnis paßt nicht zu deinen Erwartungen. Was hast du für Abweichungen festgestellt?

    Sollte dein Code tatsächlich absolut "nichts" liefern, dann sorge dafür, dass er Fehlermeldungen liefert. Insbesondere dass er die Datenbank nach SQL-Fehlern befragt und diese ausgibt.

    1. "Kein Ergebnis" gibts doch gar nicht.

      doch doch die Seite bleibt weiss...

      Du hast Erwartungen an den Code, den du geschrieben hast. Welche sind das?

      Ich erwarte dass mir alle Datensätze ausgegeben werden, welche zwischen den zwei daten liegen.

      Und das Lieferergebnis paßt nicht zu deinen Erwartungen. Was hast du für Abweichungen festgestellt?

      Lasse ich das Datum weg und suche nur nach Namen, geht der Query einwandfrei

      Sollte dein Code tatsächlich absolut "nichts" liefern, dann sorge dafür, dass er Fehlermeldungen liefert. Insbesondere dass er die Datenbank nach SQL-Fehlern befragt und diese ausgibt.

      Da die Seite weiss bleibt, kommt auch keine Fehlermeldung...leider

      1. Grr... lass die Zitatzeichen in Ruhe!

        "Kein Ergebnis" gibts doch gar nicht.
        doch doch die Seite bleibt weiss...

        Weil du keine Fehlermeldung ausgibst.

        Sollte dein Code tatsächlich absolut "nichts" liefern, dann sorge dafür, dass er Fehlermeldungen liefert. Insbesondere dass er die Datenbank nach SQL-Fehlern befragt und diese ausgibt.
        Da die Seite weiss bleibt, kommt auch keine Fehlermeldung...leider

        Weil du keine abfragst und ausgibst.

        Das mußt du ändern!

        1. Weil du keine Fehlermeldung ausgibst.

          nach dem query Schreibe ich noch den Befehel: or die (mssql_get_last_message());

          Sollte dein Code tatsächlich absolut "nichts" liefern, dann sorge dafür, dass er Fehlermeldungen liefert. Insbesondere dass er die Datenbank nach SQL-Fehlern befragt und diese ausgibt.

          Wie soll ich das machen? Streiche ich die Datumsabfrage, läuft der Code ja einwandfrei durch. Mit Datum eben nicht.

      2. hi,

        zitieren funktioniert andersherum - bitte spiele nicht mit den vorgegebenen Zitatzeichen herum, und schreibe deinen eigenen Text einfach an den Anfang einer neuen Zeile.

        "Kein Ergebnis" gibts doch gar nicht.
        doch doch die Seite bleibt weiss...

        Das ist nicht "kein Ergebnis".

        Du hast Erwartungen an den Code, den du geschrieben hast. Welche sind das?
        Ich erwarte dass mir alle Datensätze ausgegeben werden, welche zwischen den zwei daten liegen.

        Vielleicht liegen gar keine dazwischen, weil deine Bedingung ungünstig gewählt ist?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. echo $begrüßung;

    $data = mssql_query ("SELECT CONVERT(varchar(10), dbo.tblHistory.CreateDate, 104) AS datum FROM dbo.tblHistory ".
    "AND (datum between '$von' and '$bis'");

    Ob MS-SQL das auch nicht mag, weiß ich nicht, aber andere DBMS mögen es nicht, wenn man in der WHERE-Klausel mit den Alias-Namen arbeitet. Diese werden erst nach dem Ermitteln des Ergebnisses den Spalten hinzugefügt. Vorher muss man auf den originalen Spaltennamen zugreifen oder den Ausdruck, den man zu aliasen gedenkt, noch einmal hinschreiben.

    Nichtsdestotrotz: Was steht in $data nach der Abfrage drin? Lass dir das Ergebnis mit var_dump($data) ausgeben und vergleiche es mit der Funktionsbeschreibung im Handbuch.

    echo "$verabschiedung $name";

    1. Ob MS-SQL das auch nicht mag, weiß ich nicht, aber andere DBMS mögen es nicht, wenn man in der WHERE-Klausel mit den Alias-Namen arbeitet. Diese werden erst nach dem Ermitteln des Ergebnisses den Spalten hinzugefügt. Vorher muss man auf den originalen Spaltennamen zugreifen oder den Ausdruck, den man zu aliasen gedenkt, noch einmal hinschreiben.

      Mittlerweile sieht der letzte Teil des Querys so aus: "AND History1.Datum11 BETWEEN '$von' and '$bis'") or die (mssql_get_last_message());
      Es wird aber keine Fehlermeldung ausgegeben. Ersetzt ich aber das AND durch ein OR läuft der Query wieder aber natürlich mit einem falschen Resultat.

      Nichtsdestotrotz: Was steht in $data nach der Abfrage drin? Lass dir das Ergebnis mit var_dump($data) ausgeben und vergleiche es mit der Funktionsbeschreibung im Handbuch.

      var_dump gibt mir folgendes aus: resource(4) of type (mssql result) mit welchem Handbuch soll ich das jetzt den vergleichen?

      1. echo $begrüßung;

        Nichtsdestotrotz: Was steht in $data nach der Abfrage drin? Lass dir das Ergebnis mit var_dump($data) ausgeben und vergleiche es mit der Funktionsbeschreibung im Handbuch.
        var_dump gibt mir folgendes aus: resource(4) of type (mssql result) mit welchem Handbuch soll ich das jetzt den vergleichen?

        Mit dem PHP-Handbuch, denn es ist der Rückgabewert einer PHP-Funktion. "resource" bedeutet, dass schon mal kein Fehler vorliegt. Das anschließende Fetchen der Ergebnisdatensätze aus dieser Ressource sollte also auch gelingen.

        echo "$verabschiedung $name";

    2. Hallo,

      Ob MS-SQL das auch nicht mag, weiß ich nicht, aber andere DBMS mögen es nicht, wenn man in der WHERE-Klausel mit den Alias-Namen arbeitet.

      der MS SQL-Server mag das auch nicht.

      Diese werden erst nach dem Ermitteln des Ergebnisses den Spalten hinzugefügt. Vorher muss man auf den originalen Spaltennamen zugreifen oder den Ausdruck, den man zu aliasen gedenkt, noch einmal hinschreiben.

      insbesondere ist es hier ganz umgekehrt ratsam, nicht irgendwelche Zeichenketten mit BETWEEN zu vergleichen, sondern Datumsangaben.
      Das bedeutet, dass die seltsamen Zeichenketten

      '$von'

      und

      '$bis',

      die ganz bestimmt nicht so an das DBMS übergeben werden, im SQL-Statement in den passenden Datums- und Zeittyp umzuwandeln sind und nicht umgekehrt. Wie das geht, steht im Handbuch.

      Der OP sollte zuerst das SQL-Statement von Hand richtig zusammenbauen, bevor er PHP damit beauftragt.

      Freundliche Grüße

      Vinzenz