Datum aus Text umwandeln.

  • Hallo,

    ich habe folgendes Probelm. Aus einer MySql-Datenbank mit mehr als 1000 Einträgen wurden u.a Datumsangaben als TEXT über ein Formular erfasst.

    Nun stehe ich hier vor der Aufgabe, diese in ein berechenbare Einheit umzuwandeln, damit diese auf- bzw. absteigend sortiert werden und anschließend wieder im Ursprungszusand angezeigt werden sollen.

    Das Textformat ist 01.01.2010 also (tt.mm.yyyy)

    Damit nun ORDER BY datum richtig greifen kann muss ich sie in ein berecnhenbares Format umwandeln und anschließend wieder zurück
    wandeln.

    Kann mir jemand dabei etwas zur Hand gehen, bitte.

    Danke.

  • date_format wird da nicht helfen, weil die Tabellenspalte nicht vom Typ Date bzw. DateTime ist. Mit varchar ist man da hoffnungslos verloren. Da hilft nur ein Script schreiben, dass den Text rausliest und in einen Timestamp umwandelt. Dann diesen Timestamp zusätzlich speichern. Ist zwar auch nicht schon, aber in diesem Fall wohl die einfachste Lösung.

  • Alternativ:

    SQL
    SELECT CONCAT(SUBSTRING('01.02.1977',7,4),'-',SUBSTRING('01.02.1977',4,2),'-',SUBSTRING('01.02.1977',1,2));

    So wandel ich z.B. die Geburtsdaten aus Formularfeldern um ;)

    Aus Performance-Sicht ist es aber immer besser ein Datum als DATE oder DATETIME zu speichern.

  • Für die Speicherung in MySQL sollte man auch MySQL-Funktionen verwenden. In diesem Fall UNIX_TIMESTAMP() für den Unix-Zeitstempel.

    Warum?

    Durch time ist sichergestellt das bei beiden die Zeit übereinstimmt

  • Jo, danke erstmal für die vielen Hinweise.

    So ich habe erstmal folgendes probiert:

    Funktioniert bis dato einwandfrei :)

    Danke.

    Einmal editiert, zuletzt von Hauer (8. Juni 2010 um 12:16)

  • Hallo noch mal allerseits.

    Irgendwie haut das obige doch nicht ganz hin. Die Sortierung ist mal hü und mal hop. Also eher unbefriedigend.

    Ich hab mich jezt dazu entschlossen, auf die date() Variante umzusteigen. Lieber jetzt noch einmal ordentlich und dann habe ich Ruhe. Ist zwar ne Menge Arbeit aber was soll´s.

    Also, das Datum wird per Kalender, erzeugt durch ein JavaSript in das Form Feld geschrieben. Das Format ist tt-mm-jjjj.

    Ich habe mir mal ne Art Runnig-Order zurecht gelegt.

    1. Muss ich in der Datenbank das Feld Datum mit der Formatierung Text in date ändern.

    2. Muss ich in allen Form Feldern den type Text in Date ändern.

    3. Das php-Script um die notwendigen Änderungen anpassen.

    3. Alle Datensätze im Änderungsformular aufrufen und das Datum berichtigen.

    Um möglichst am Ende das richtige Ergebniss zu erzielen stellt sich für mich die Frage, wie ich jetzt an die Sache rangehe.

    UNIX_TIMESTAMP() ist doch der Zeitstempel, der automatisch generiert wird, wenn ich etwas in die Datenbank schreiben, oder ???

    Da ich ja Daten aus der Vergangenheit und der Zukunft erfasse, kommt für mich ein Automatismus nicht in Frage.

    Im Grunde muss ich doch das per Java-Script eingefügte Datum nehmen, es in die amerikanische Schreibweise umwandeln und es beim Auslesen, durch Anzeigen oder beim Aufrufen durch das Änderunsformular wieder in das deutsche Format umwandeln. Somit müsste es doch dann chronologisch zu Sortieren sein, oder!?

    Kann mir jemand etwas dabei zu Hand gehen bitte.

    Danke euch soch mal im voraus.

  • PHP
    <?php
       $date = explode("-", $_POST['datum']);
    
       if (count(date) == 3)
          $date_for_db = $date[2] . ":" . $date[1] . ":" . $date[0];
       else
          $date_for_db = "0000:00:00";
    ?>
  • Hacking Hacking Hacks.....

    Unglaublich verwendet halt immer den Timestamp an der Stelle wo du ihn ausgeben willst wandelst ihn mit date oder sonst was in ein Format um

    mfg

  • Ok, alles klar.

    ich habe nun das Skript soweit drin, bekomme aber immer die Fehlermeldung:

    Notice: Use of undefined constant date - assumed 'date' in.....

    PHP
    if (count(date) == 3)
  • Hast du "date" überhaupt definiert?
    Und so, wies aussieht benutzt du keine Konstante, sondern Variabeln.

    Diese schreibt man dann mit einem Dollarzeichen, also so: "$date", dann würds gehen.

  • Ich muss jetzt mal ein paar Dumme Fragen stellen, sonst verstehe ich das nicht und komme nicht weiter:

    Ich verarbeite das Form Feld folgendermaßen:

    HTML
    <td valign="top" align="left"><input name="datum" type="date" id="datum" size="15" />
                  <a href="javascript:showCal('Calendar1')"><img  src="../images/datum.png" width="100" height="20" border="0"  align="absmiddle"></a></td>

    Das Feld wird mit dem Datum angezeigt: 13.08.2010

    Dann sende ich es per Post an das php Script.

    Muss ich jezt vor dem Skript noch eine Definition festlegen, die ich dann in dem Script :

    PHP
    $date = explode("-", $_POST['datum']);
    
       if (count(date) == 3)
          $date_for_db = $date[2] . ":" . $date[1] . ":" . $date[0];
       else
          $date_for_db = "0000:00:00";

    einbinde ?

    Ich verstehe das obige Script jetzt folgendermaßen:

    $date = explode("-", $_POST['datum']); wandelt das per Post gesendete
    Datum in 13-08-2010 in Form eines Arrays um.

    Dann wird das Datum in der Reihenfolge 2010:08:13 gesetzt....usw.

    Irgendwie ist mir die Definition unklar ?

  • Du schreibst doch:

    PHP
    if (count(date) == 3)

    Du musst aber:

    PHP
    if(count($date) == 3)

    Andere Frage:
    Willst du eigentlich nicht mit Timestamps arbeiten?
    Ich verwende stets Timestamps und speicher diese dann als Integer in der Datenbank.

  • Erst mal Entschuldigung, ich habe eine falsche Vorgabe gegeben.

    tt-mm-jjjj war nicht ganz richtig, tt.mm.jjjj, sorry dafür, habe es im Script berücksichtigt.

    Ja, ich würde gerne mit dem $timestamps arbeiten, da es ja auch besser umzuwandeln sein soll, und überhaupt....

    Würdest du mich bitte etwas dabei unterstützen ?

    Wie muss ich da vorgehen?