Jochen: Datum sortieren

Hallo,

ich habe folgende MySQL Abfrage:

  
// Daten auslesen für die Anzeige  
$sql = "SELECT * FROM Bewertungen LEFT JOIN Export ON Bewertungen.be_gast = Export.hotel_eMaillID  WHERE Bewertungen.be_status = '1' AND Export.hotel_Hotel = 'TIC' ORDER by Export.hotel_Abreise ASC";  
$sql_anzeige = mysql_query($sql);  
$sql_anz = mysql_num_rows($sql_anzeige);  
  

Mein Datum steht so in der DB drin: 28.10.2012 usw... leider wird mir das Datum nicht richtig sortiert. Was mache ich falsch?

Gruß
Jochen

  1. Lieber Jochen,

    Mein Datum steht so in der DB drin: 28.10.2012 usw...

    das ist sehr ärgerlich, denn dann kann Dein MySQL es auch nicht korrekt sortieren.

    leider wird mir das Datum nicht richtig sortiert.

    Logisch.

    Was mache ich falsch?

    Du erwartest, dass MySQL irgendwelche Strings als Datum erkennt und entsprechend sortiert. Wenn die Daten im richtigen Datentyp vorlägen (in Deinem Fall "Date"), wüsste MySQL auch, wie es damit umzugehen hätte.

    Wenn Du nicht MySQL sondern einen anderen DB-Server verwendest, dann wäre es nützlich gewesen, dieses vorher zu verraten.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hallo,

      Du erwartest, dass MySQL irgendwelche Strings als Datum erkennt und entsprechend sortiert. Wenn die Daten im richtigen Datentyp vorlägen (in Deinem Fall "Date"), wüsste MySQL auch, wie es damit umzugehen hätte.

      das habe ich mir fast gedacht, aber was kann ich da machen, die Daten werden Nachts so automatisch in die Datenbank eingespielt, da habe ich leider kein Einfluss drauf.

      Kann das MYSQL das nicht im SQL umwandeln?

      Gruß
      Jochen

      1. Tach!

        Kann das MYSQL das nicht im SQL umwandeln?

        Es kann. Siehe Handbuch-Kapitel zu den Funktionen, da gibt es Datum- und Zeit-Funktionen, speziell STR_TO_DATE().

        dedlfix.

  2. Mein Datum steht so in der DB drin: 28.10.2012 usw... leider wird mir das Datum nicht richtig sortiert. Was mache ich falsch?

    1.)
    Du gibst die Antwort selbst. Du versuchst Text zu sortieren.

    2.)
    Du solltest mit der Faust auf den Tisch hauen. Da hat jemand RICHTIG Scheiße gebaut, als er die Tabellenspalte als Text anlegte und mit Text statt einem Datum fütterte.

    3.)
    Es handelt sich um einem grundlegenden Designfehler, der definitiv weitere Probleme nach sich ziehen wird.

    4.)
    Um das Problem ein- für allemal zu beheben ist eine Spalte mit dem Datum als Datum hinzuzufügen und die Tabelle automatisch upzudaten:

    UPDATE tabelle set datum=STR_TO_DATE(text, '%d.%m.%Y');

    Das neue Datumsfeld ist mit einem Index zu versehen.

    Es ist festzustellen, welche Programme oder Skripte das Datum als Text eintragen, diese sind anzupassen. Von da an haben alle Ein- und Ausgaben in/aus das/dem neuen Datumsfeld zu erfolgen.

    5.)
    Das alles ist sofort zu machen. Meint irgendwer, das man sich das ersparen kann, dann mag das bei 3 Datensätzen scheinbar noch funktionieren. Danach immer weniger, denn jeder Deiner Abfragen quasi die komplette Tabelle durchgerechnet werden, das benutzen eines Index ist nicht möglich.

    Konsequenz: Die Dauer der Abfragen wird sehr schnell sehr unangenehm. Und weil bis dahin der alte Fehler in noch mehr Skripten verbaut wurde wird die Behebung nur NOCH TEURER!

    Fred

    1. Hi Fred!

      Erstmal, Deine Antwort ist (zum Teil) echt gut :-)

      Mein Datum steht so in der DB drin: 28.10.2012 usw... leider wird mir das Datum nicht richtig sortiert. Was mache ich falsch?

      1.)
      Du gibst die Antwort selbst. Du versuchst Text zu sortieren.

      gut :-)

      2.)
      Du solltest mit der Faust auf den Tisch hauen. Da hat jemand RICHTIG Scheiße gebaut, als er die Tabellenspalte als Text anlegte und mit Text statt einem Datum fütterte.

      Das haben, je nach Erstelldatum der db schon recht viele gemacht. Also mal halblang an dieser Stelle.

      3.)
      Es handelt sich um einem grundlegenden Designfehler, der definitiv weitere Probleme nach sich ziehen wird.

      Soweit, so richtig. Aber wir wollen ja hier nicht die Dramaqueen machen, oder?

      4.)
      Um das Problem ein- für allemal zu beheben ist eine Spalte mit dem Datum als Datum hinzuzufügen und die Tabelle automatisch upzudaten:

      UPDATE tabelle set datum=STR_TO_DATE(text, '%d.%m.%Y');

      Ok. Jetzt sind wir wieder in einem Boot, wir zwei Beiden *g*

      Das neue Datumsfeld ist mit einem Index zu versehen.

      Von mir aus.

      Es ist festzustellen, welche Programme oder Skripte das Datum als Text eintragen, diese sind anzupassen. Von da an haben alle Ein- und Ausgaben in/aus das/dem neuen Datumsfeld zu erfolgen.

      Ok, das eine bedingt das andere...

      5.)
      Das alles ist sofort zu machen. Meint irgendwer, das man sich das ersparen kann, dann mag das bei 3 Datensätzen scheinbar noch funktionieren. Danach immer weniger, denn jeder Deiner Abfragen quasi die komplette Tabelle durchgerechnet werden, das benutzen eines Index ist nicht möglich.

      Dramaqueen *g*
      Es sollte sicher gemacht werden.
      Aber Panik schieben würde ich auch nicht.
      Prüfe, wann Du (unter Bercüksichtigung Deines Datenaufkommens die Zeit dazu hast...und Du hast Zeit, glaube mir...) und mach es dann...

      Konsequenz: Die Dauer der Abfragen wird sehr schnell sehr unangenehm. Und weil bis dahin der alte Fehler in noch mehr Skripten verbaut wurde wird die Behebung nur NOCH TEURER!

      Dramaqueen ;-)

      Gruß, Freak

      1. Dramaqueen *g*
        Es sollte sicher gemacht werden.
        Aber Panik schieben würde ich auch nicht.
        Prüfe, wann Du (unter Bercüksichtigung Deines Datenaufkommens die Zeit dazu hast...und Du hast Zeit, glaube mir...) und mach es dann...

        Wenn ich die Ausgangsfrage richtig verstehe, dann geht es um ein Hotelbewertungsportal. Du weisst schon, dass die Ressourcen - eine davon ist die Skriptlaufzeit - begrenzt sind.

        Das mit der Zeit ist da so eine Sache ... irgendwann wird es Probleme mit der Skriptlaufzeit geben und glaube mir, dann muss es sehr schnell gehen. Wenn die chose nämlich einmal steht, dann spielen alle verrückt und wollen die Lösung bis vorgestern. Und dann, ja dann wird aus genau diesem Grund das nächste Provisorium mit dem nächsten Ablaufdatum (Tenor: "Bis das eintritt ist noch viel Zeit!") gebaut.

        Zudem: Wenn das schon falsch gemacht wurde, was dann noch?

        fred

        1. Wenn ich die Ausgangsfrage richtig verstehe, dann geht es um ein Hotelbewertungsportal.

          Ach soooo. Quasi "the next facebook" ;-)
          Traffik ohne Ende. Einzigartig ... sozusagen das Alleinstellungsmerkmal unter den Websites schlechthin...

          Du weisst schon, dass die Ressourcen - eine davon ist die Skriptlaufzeit - begrenzt sind.

          Natürlich. Da ist Panik sozusagen nicht "bug, sondern feature". Deine Bedenken sind ja angebracht... aber Drama?? Eben nicht. ;-)

          Das mit der Zeit ist da so eine Sache ... irgendwann wird es Probleme mit der Skriptlaufzeit geben und glaube mir, dann muss es sehr schnell gehen.

          Nein. Das Script läuft derzeit eh nicht.
          Insofern wird es, wenn in "Anno futuremal" die Skriptlaufzeit mal (hoffentlich) erreicht werden wird (und es wird vorraussichtlich nicht!) sich das Szenario zu heute nicht groß ändern. Function follows Designfehler. Kein Grund zur Panik, Grund zum handeln. Nicht mehr, nicht weniger.

          Wenn die chose nämlich einmal steht, dann spielen alle verrückt

          Alle Dramaqueens. Ja.

          und wollen die Lösung bis vorgestern.

          Ja.

          Und dann, ja dann wird aus genau diesem Grund das nächste Provisorium mit dem nächsten Ablaufdatum (Tenor: "Bis das eintritt ist noch viel Zeit!") gebaut.

          So der Programmierer Dramenaffin ist, ja. Sonst: Nein.

          Zudem: Wenn das schon falsch gemacht wurde, was dann noch?

          Spekulation. Drama.
          Nicht mehr, nicht weniger.

          fred

          Freak

  3. Hi

    Je nach dem wie du da drin steckst und was du zu sagen hast, würd ich dringend erwähnen dass die bisherige Vorgehensweise unprofessionell ist. Das ist absoluter Murks und wirds auch mit sämtlichen Verbesserungen bleiben, solange die Spalte vom Typ String ist. Da halte ich einen Hinweis an die Verantwortlichen schon für gerechtfertigt.

    Du musst nur aufpassen dass der Hinweis nicht zurück kommt, indem jemand sagt hey ich schick dir die Daten als XML oder irgendwas, wenn du (!) die dann nicht sauber umwandelst sondern direkt den String einträgst bist du selber schuld.
    Das hängt stark davon ab wer für die Tabelle verantwortlich ist. Wer verwaltet die? Evtl. kannst du den Spaltentyp ändern und dann wird automatisch bei jedem eingetragenen Datensatz der String in ein Datum umgewandelt? Mach dich da mal schlau. Der SqlServer von MS macht das zum Beispiel so, man muss nur drauf achten in welchem Format er den Datumsstring erwartet.