small-step: MySQL 4.0x alternative zu DATEDIFF

Hallo alle,

ich musste mit einem Projekt auf einen anderen Server umziehen auf dem eine ältere MySQL-Version läuft als auf dem bisherigen. Jetzt stehe ich vor dem Problem, dass eine meiner Abfragen nicht mehr funktioniert, da ich DATEDIFF nutze.

Hier das Statement:

SELECT
    tbverliehen.DatumVerliehen,
    tbverliehen.DatumRueckgabe,
    tbverliehen.Anzahl,
    tbbestand.Titel,
IF
    (tbverliehen.DatumVerliehen > tbverliehen.DatumRueckgabe,
    DATEDIFF(CURDATE(),tbverliehen.DatumVerliehen),
    DATEDIFF(tbverliehen.DatumRueckgabe,tbverliehen.DatumVerliehen))
AS Leihdauer
FROM tbverliehen
LEFT JOIN tbbestand ON (tbverliehen.FKBestand = tbbestand.PKBestand)
WHERE tbverliehen.FKKunde = '".$_SESSION['kundennummer']."'"

Ist ein Projekt für eine Prüfung, daher die seltsamen Entitäten...

Ich würde die Berechnung der Datumsunterschiede nur ungern außerhalb der Datenbank erledigen, das macht Sinn, oder? Weiß jemand wie ich diese Berechnung in MySQL lösen kann ohne DATEDIFF zu nutzen?

Danke schonmal,

small-step

  1. Hallo small-step

    ich musste mit einem Projekt auf einen anderen Server umziehen auf dem eine ältere MySQL-Version läuft als auf dem bisherigen. Jetzt stehe ich vor dem Problem, dass eine meiner Abfragen nicht mehr funktioniert, da ich DATEDIFF nutze.

    das sollte Dich lehren, dass es eine gute Idee ist, genau die Version zu nutzen, auf der das Projekt später laufen soll (wenn das bekannt ist).

    Ich würde die Berechnung der Datumsunterschiede nur ungern außerhalb der Datenbank erledigen, das macht Sinn, oder? Weiß jemand wie ich diese Berechnung in MySQL lösen kann ohne DATEDIFF zu nutzen?

    TO_DAYS() sollte Dir helfen, siehe auch zweiter Benutzerkommentar.

    Freundliche Grüße

    Vinzenz

    PS: Hast Du irgendwo Subselects verwendet? Die kann MySQL 4.0.x auch noch nicht.

    1. Hallo Vinzenz Mai,

      das sollte Dich lehren, dass es eine gute Idee ist, genau die Version zu nutzen, auf der das Projekt später laufen soll (wenn das bekannt ist).

      Es lehrt mich nichts :-)

      Eigentlich ist es ein Schulprojekt. Vorbereitung auf die IHK-Prüfung, nur unter völlig unrealistischen Voraussetzungen. Kaum Zeit, nicht die geringste Richtungsvorgabe und bösartige Lehrkörper. Und die Tatsache, dass der Server den wir vorher zur Verfügung hatten mitsamt seinem Besitzer umgezogen ist und noch keinen Internetanschluss hat... Jetzt läuft das Projekt auf einem bisschen Webspace von einem Bekannten und der ist eben nicht das neuste vom neuen.

      TO_DAYS() sollte Dir helfen, siehe auch zweiter Benutzerkommentar.

      Muss ich mal schauen. Ich dachte da könnten eventuell Probleme auftreten, wenn es sich nicht um das selbe Jahr handelt. Mal schauen.

      PS: Hast Du irgendwo Subselects verwendet? Die kann MySQL 4.0.x auch noch nicht.

      Nein, ich hab für alles einen Join gerollt...

      Danke für die Hilfe, ich versuch es mal mit TO_DAYS!

      Gruß,
      small-step

      1. Hallo small-step,

        Eigentlich ist es ein Schulprojekt. Vorbereitung auf die IHK-Prüfung, nur unter völlig unrealistischen Voraussetzungen. Kaum Zeit, nicht die geringste Richtungsvorgabe und bösartige Lehrkörper.

        das ist doch gar nicht so schlimm. Stell' Dir vor, Du hast ein 16er-Prüfungsfeld und eine Prüfungsaufgabe, die für jeden Teilnehmer ca. 16 MB RAM benötigt, für Single-User-PC mit Linux konzipiert ist. Prüfungsumgebung: Multiuserumgebung auf einem Rechner mit insgesamt 64 MB RAM für alle 16 zusammen (ja, ist ein paar Jährchen her) ...

        Stell' Dir vor, Du hast eine theoretische Prüfungsaufgabe (20 von 100 Punkten) mit ca. 50 Zeilen Code, davon die ersten fünf Zeilen mit einem Zeilenkommentar versehen. Deine Aufgabe besteht darin, hinter jede weitere Zeile einen Kommentar zu schreiben, was die Anweisung bewirkt. Deine Ansicht ist: Der Inhalt der ersten fünf Kommentare ist Mist. Für jede der 50 Zeilen gilt: Diese Anweisung ist ungültig. Geht nicht. (Du notierst Dir auf einem Schmierblatt die Aufgabe, fütterst am Abend einen Editor - und der Compiler gibt für jede Zeile aus: Geht nicht!).

        Dann doch lieber Schwierigkeiten bei der Prüfungsvorbereitung :-)

        TO_DAYS() sollte Dir helfen, siehe auch zweiter Benutzerkommentar.

        Muss ich mal schauen. Ich dachte da könnten eventuell Probleme auftreten, wenn es sich nicht um das selbe Jahr handelt. Mal schauen.

        naja, ich gehe mal davon aus, dass Deine Datumsangaben nicht _vor_ der Gregorianischen Kalenderreform liegen :-)

        PS: Hast Du irgendwo Subselects verwendet? Die kann MySQL 4.0.x auch noch nicht.
        Nein, ich hab für alles einen Join gerollt...

        Es gibt vieles, wo Du um ein Subselect im Prinzip nicht herumkommst. Eine spezielle Problemstellung kommt hier mindestens zweimal pro Woche: Du möchtest nach einer Spalte gruppieren - und die Details zum neuesten (oder ältesten oder ...) Datensatz wissen. Nein, da kommst Du nur mit einem sehr schmutzigen und ineffizienten Trick um ein Subselect herum.

        Freundliche Grüße

        Vinzenz

        1. Hallo Vinzenz,

          Ich erlaube mir die beiden Postings zu mergen...

          eine erfolgreiche Prüfung!

          Vielen Dank.

          das ist doch gar nicht so schlimm. Stell' Dir vor, Du hast ein 16er-Prüfungsfeld und eine Prüfungsaufgabe, die für jeden Teilnehmer ca. 16 MB RAM benötigt, für Single-User-PC mit Linux konzipiert ist. Prüfungsumgebung: Multiuserumgebung auf einem Rechner mit insgesamt 64 MB RAM für alle 16 zusammen (ja, ist ein paar Jährchen her) ...

          Entweder ich hab die Aufgabe nicht verstanden oder irgendwas passt da nicht... :-)

          Stell' Dir vor, Du hast eine theoretische Prüfungsaufgabe (20 von 100 Punkten) mit ca. 50 Zeilen Code, davon die ersten fünf Zeilen mit einem Zeilenkommentar versehen. Deine Aufgabe besteht darin, hinter jede weitere Zeile einen Kommentar zu schreiben, was die Anweisung bewirkt. Deine Ansicht ist: Der Inhalt der ersten fünf Kommentare ist Mist. Für jede der 50 Zeilen gilt: Diese Anweisung ist ungültig. Geht nicht. (Du notierst Dir auf einem Schmierblatt die Aufgabe, fütterst am Abend einen Editor - und der Compiler gibt für jede Zeile aus: Geht nicht!).

          Was ähnliches dachte ich in der Zwischenprüfung vor mir zu haben. Funktioniert hat es letztendlich schon, es war nur fürchterlich erläutert. Ich glaube da ging es um eine Datenbanksoftware.

          Was gab es für diese Aufgabe an Punkten? Wenn das Programm Müll ist kann man Dir ja kaum Abzug geben, oder? Oder hast Du hinter jede Zeile // wird nicht funktionieren geschrieben? ;-)

          naja, ich gehe mal davon aus, dass Deine Datumsangaben nicht _vor_ der Gregorianischen Kalenderreform liegen :-)

          Nein, davon kann man glaube ich getrost ausgehen.

          Es gibt vieles, wo Du um ein Subselect im Prinzip nicht herumkommst. Eine spezielle Problemstellung kommt hier mindestens zweimal pro Woche: Du möchtest nach einer Spalte gruppieren - und die Details zum neuesten (oder ältesten oder ...) Datensatz wissen. Nein, da kommst Du nur mit einem sehr schmutzigen und ineffizienten Trick um ein Subselect herum.

          Meine Güte, das ist kaum mehr ein Trick... Es soll funktionierende Software geben die mit weniger Zeilen Code auskommt...

          Bis jetzt benötige ich keine Subselects. Ich denke das lässt sich bei dieser Aufgabe auch vermeiden. Zumindest wenn man bedenkt wie wenig wir ins Detail gehen werden.

          Gruß,
          small-step

    2. Hallo Vinzenz,

      TO_DAYS() sollte Dir helfen, siehe auch zweiter Benutzerkommentar.

      Ich könnte schwören ich hätte es besser durchgelesen... Na ja, mit TO_DAYS funktioniert es einwandfrei. Dankeschön.

      Schönen Abend noch :-)

      small-step

      1. Hallo small-step,

        Dankeschön.
        Schönen Abend noch :-)

        eine erfolgreiche Prüfung!

        Freundliche Grüße

        Vinzenz