Ankündigung

Einklappen
Keine Ankündigung bisher.

Datenbankeinträge umwandeln (RegEx)

Einklappen

Neue Werbung 2019

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

  • Datenbankeinträge umwandeln (RegEx)

    Hi,

    ich habe ein kleines Problem und das reißt für meine Kenntnisse schon einige Bereiche an, von denen ich nicht wirklich was verstehe.

    Also. ich habe eine Mysql Datenbank laufen (Database.Tabelle).
    In der Tabelle gibt es eine Spalte mit dem Namen "Date". Das Datumsformat ist: Thu Nov 4 22:49:14

    Ich habe mir einen regulären Ausdruck geschrieben, mit dem ich das Datum "erfassen" kann.
    Code:
    ^(Sun|Mon|Tue|Wed|Thu|Fri|Sat)\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(0{0,1}[1-9]|[12][0-9]|3[01])\s+(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])$&is
    Jetzt zum eigentlichen Problem.

    Ich will mittels PHP auf die Spalte zugreifen und das Datum in Einzelteilen verarbeiten.
    Es sollen neue Spalten erstellt/befüllt werden (kann ich auch eigentlich händisch erstellen). Und zwar:
    * Wochentagname
    * Tag
    * Monat
    * Uhrzeit
    * Tageszeit


    Das "Thu" soll in Wochentagname übertagen werden, "4" in Tag, "Nov" in Monat, "22:49:14" in Uhrzeit.

    Jetzt kommt noch eine Schwierigkeit, die man vermutlich mit einer if-else Geschicht lösen könnte.

    Wenn die Uhrzeit 21:00:01 bis 06:00:00 ist, soll in "Tageszeit" "nachts" stehen.
    Bei 06:00:01 bis 12:00:00 "vormittags".
    Bei 12:00:01 bis 14:00:00 "mittags".
    Bei 14:00:01 bis 18:00:00 "nachmittags".
    Bei 18:00:01 bis 21:00:00 "abends".


    Mein Problem besteht darin, wie ich das alles unter einen Hut bringen kann. Ich hab sowas vorher noch nie gemacht.

    Danke fürs lesen
    Echo23

  • #2
    Du speicherst die Zeitangaben in so einem Format "Thu Nov 4 22:49:14" in der Datenbank ab? Es gibt doch den Typ DateTime.

    Kommentar


    • #3
      Die Datenbank hab ich so bekommen. Meines Wissens wird das Datum von einem externen Programm so in die Datenbank geschrieben.

      Kommentar


      • #4
        Zitat von Echo23 Beitrag anzeigen
        Das Datumsformat ist: Thu Nov 4 22:49:14
        Das ist kein vollständiges Datum - das Jahr fehlt.
        Ob man damit überhaupt sinnvoll arbeiten kann, bezweifle ich.

        Zum Zerlegen in die einzelnen Bestandteile kannst du explode verwenden.

        Kommentar


        • #5
          oder so:
          PHP-Code:
          $x='Thu Nov 4 22:49:14';
          var_dump(preg_split('#[ :]#',$x)); 

          Kommentar


          • #6
            Soweit so gut. Ich kann zur Datenbank connecten und die Aufspaltung des Datums funktioniert mit der Variable x.

            Die Verarbeitung der Arrays zu Strings klappt auch.

            Vielleicht liegts an der Uhrzeit, aber ich komm grad nicht drauf.

            Wie schaffe ich es, dass das Datum zeilenweise eingelesen wird, dann aufgespalten und danach in die neuen Spalten (natürlich in die richtige Zeile) geschrieben wird?
            Ich tippe mal auf ne Schleife. Aber wie konkret ich die in diesem Fall anwenden muss, entzieht sich meiner Kenntnis.

            PHP-Code:
            <?php

            $mysqlhost
            ="localhost"// MySQL-Host angeben
            $mysqluser="user"// MySQL-User angeben
            $mysqlpwd="pass"// Passwort angeben
            $mysqldb="DB"// Gewuenschte Datenbank angeben


            $connection=mysql_connect($mysqlhost$mysqluser$mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");

            mysql_select_db($mysqldb$connection) or die("Konnte die Datenbank nicht waehlen.");

             
            $sql "SELECT date FROM tabelle";

            $datums_query mysql_query($sql) or die("Anfrage nicht erfolgreich");

             
            $anzahl mysql_num_rows($datums_query);

            echo 
            "Anzahl der Datensaetze: $anzahl <br/>"//Kleine Kontrolle ob die Verbindung stimmt


            // hilfvariable zum offline testen: $x='Thu Nov  4 22:49:14';
             
            $zeichen = (preg_split('#[ ]#',$datums_query));  

            // Spaltet das Datum auf in 
            // Array ( [0] => Thu [1] => Nov [2] => 4 [3] => 22:49:14 ) 

             
            print_r($zeichen);

             
            $zeichen[0] = serialize($dayword);
             
            $zeichen[1] = serialize($month);
             
            $zeichen[2] = serialize($daydigit);
             
            $zeichen[3] = serialize($time);

            ?>
            Btw. wär das ganze nicht auch wesentlich sinniger, wenn dieses umformatieren innerhalb der Datenbank passiert? Denn es werden ja immer neue Daten geschrieben und es macht ja keinen Sinn jedesmal das PHP Script aufzurufen, dass wieder von vorne diese Monsterdatenbank abarbeitet.

            Kommentar


            • #7
              Zitat von Echo23 Beitrag anzeigen
              Wie schaffe ich es, dass das Datum zeilenweise eingelesen wird
              Wie du die Datensätze eines Abfrageergebnisses in einer Schleife auswertest/anzeigst, findest du in so gut wie jedem Anfänger-Tutorial beschrieben.

              Das, worauf du preg_split da anwenden willst, ist allerdings unsinnig.
              (Und dass du, nur um am Leerzeichen zu splitten, preg_split anwenden willst, ist auch unsinnig - das geht auch mit explode, und zwar günstiger.)
              und danach in die neuen Spalten (natürlich in die richtige Zeile) geschrieben wird?
              Welche „neuen Spalten“?
              Willst du die Datensätze in der Datenbank verändern? Dazu dient ein UPDATE-Statement. Wenn dir das nichts sagt, ebenfalls -> Tutorial.

              http://www.php.de/php-einsteiger/489...nsammlung.html

              Kommentar


              • #8
                PHP-Code:
                $datums_query mysql_query($sql) or die("Anfrage nicht erfolgreich");
                $anzahl mysql_num_rows($datums_query);
                echo 
                "Anzahl der Datensaetze: $anzahl <br/>"//Kleine Kontrolle ob die Verbindung stimmt
                while(($data mysql_fetch_assoc($datums_query)) !== false)
                {
                // hilfvariable zum offline testen: $x='Thu Nov  4 22:49:14';
                 
                $zeichen = (preg_split('#[ ]#',$data['date']));  

                // Spaltet das Datum auf in 
                // Array ( [0] => Thu [1] => Nov [2] => 4 [3] => 22:49:14 ) 

                 
                print_r($zeichen);

                 
                und so weiterund so weiter ....


                Statt mysql_fetch_assoc gibt es aber auch noch andere Befehle, die du verwenden könntest. Einer davon ist z. B. mysql_fetch_object

                Hoffentlich hast du mit dieser date-Spalte keine Probleme beim SELECT. Falls doch, dann unter ´ setzen.

                Kommentar


                • #9
                  @ChrisB

                  Ja, ich will im Grunde genommen nur die Datenbank verändern. Nämlich das ziemlich bescheuerte Datum aufsplitten und in einzelne Spalten verteilen. Später dann die Zuordnung in vormittags, mittags usw. aber das ist ja in mysql sehr einfach realisierbar.

                  Kommentar


                  • #10
                    Wie viele Datensätze hast du denn ungefähr?

                    EDIT:
                    Ich muss ins Bett.
                    Warum ich gefragt habe:
                    Sind es wirklich sehr viele Datensätze, wäre es wahrscheinlich nicht schlecht:
                    1) das über CLI zu machen
                    2) eine Zwischentabelle anzulegen
                    3) die Datensätze ev. in Blöcken abzuarbeiten
                    D. h. zuerst die Tabelle nehmen und kopieren. Dann in der Kopie die Sachen umändern, dann von der Kopie zum Original zurückschwenken.
                    Aber ich muss jetzt ins Bett.

                    Kommentar


                    • #11
                      Aktuell 14.431
                      Werden aber permanent mehr werden.

                      Das schlechte Datumsformat ist im moment nicht zu ändern. Wird aber irgendwann in Zukunft verbessert.

                      Kommentar


                      • #12
                        14.431 ist wenig.
                        Da funktioniert jede Variante

                        Kommentar


                        • #13
                          Nämlich das ziemlich bescheuerte Datum aufsplitten und in einzelne Spalten verteilen.
                          Was keinen Vorteil bringt. Die einzig sinnvolle Maßnahme ist echte Datumstypen zu verwenden. Was aber ein Problem ist, denn je nachdem, wie viele Jahre die aktuellen Eingaben bereits umfassen, sind die Datumsformate gar nicht eindeutig.

                          Später dann die Zuordnung in vormittags, mittags usw
                          Das sagt die Zeit aus. Sowas zu speichern ist genau so ein Unsinn.

                          Kommentar


                          • #14
                            'Thu Nov 4 22:49:14' => umformen zu => 2010-11-04 22:49:14
                            (Und hoffen, dass wirklich überall das Jahr 2010 gemeint war)
                            und das ganze dann in eine neue Spalte des Typs datetime speichern

                            Es sollen neue Spalten erstellt/befüllt werden (kann ich auch eigentlich händisch erstellen). Und zwar:
                            * Wochentagname
                            * Tag
                            * Monat
                            * Uhrzeit
                            * Tageszeit
                            Aus diesem datetime-Wert kannst du mit DATE_FORMAT() all diese Teile extrahieren, z.B.

                            Code:
                            SELECT 
                                 DATE_FORMAT(datum,'%d') as Tag,
                                 DATE_FORMAT(datum,'%m') as Monat
                               ...
                            usw.
                            Daher brauchst du außer dieser einen Spalte keine weiteren.

                            Kommentar


                            • #15
                              Hab mein Problem jetzt vollständig gelöst. Hier die Lösung, falls sie jemand gebrauchen kann.

                              PHP-Code:
                              <?php
                              // Neue Spalten in bsptabelle müssen hinter der Spalte "StartTime" erstellt werden:
                              //
                              // dayword    (text)        [Bsp: Thu]
                              // month    (text)        [Bsp: Nov]
                              // daydigit    (int(2))    [Bsp: 22]
                              // usetime    (time)        [Bsp: 12:14:33]
                              // abstracttime (text)        [Bsp: mittags]

                              error_reporting(E_ALL);
                              ini_set('display_errors'1);

                              $mysqlhost="localhost"// MySQL-Host angeben
                              $mysqluser="user";     // MySQL-User angeben
                              $mysqlpwd="pass";     // Passwort angeben
                              $mysqldb="DB";     // Gewuenschte Datenbank angeben


                              $connection=mysql_connect($mysqlhost$mysqluser$mysqlpwd) or die ("Verbindungsversuch fehlgeschlagen");

                              mysql_select_db($mysqldb$connection) or die("Konnte die Datenbank nicht waehlen.");

                               

                              $sql "SELECT StartTime,ID FROM bsptabelle";

                              $datums_query mysql_query($sql) or die("Anfrage nicht erfolgreich");

                               
                              $anzahl mysql_num_rows($datums_query);

                              echo 
                              "Anzahl der Datensaetze: $anzahl <br/>"//Kleine Kontrolle ob die Verbindung stimmt


                              while(($data mysql_fetch_assoc($datums_query)) !== false//Datum wird zerlegt
                              {

                               
                              $zeichen = (preg_split("/[\s,]+/",$data['StartTime']));  


                               
                              Spaltet das Datum auf in 
                               
                              Array ( [0] => Thu [1] => Nov [2] => [3] => [4] => 22:49:14 )

                               
                              print_r($zeichen);

                              $dayword $zeichen[0];
                              $month $zeichen[1];
                              $daydigit $zeichen[2];
                              $usetime $zeichen[3];
                              $id=$data['ID'];


                              echo 
                              "Der Wert ist:  $dayword$month$daydigit$usetime$id <br/>";

                              $sqlsend "UPDATE bsptabelle SET dayword='$dayword', month='$month', daydigit='$daydigit', usetime='$usetime' WHERE ID='$id' ";
                              $datums_query_2 mysql_query($sqlsend) or die("Schreiben nicht erfolgreich");

                              }


                              // --- Datumsumformatierung endet, Zuweisung der Tageszeit folgt


                              $sql "SELECT usetime,ID FROM bsptabelle";

                              $datums_query mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              while ((
                              $data mysql_fetch_assoc($datums_query)) !== false)
                              {
                              $time $data['usetime'];
                              $id $data['ID'];

                              if (
                              $time "21:00:00" && $time <= "06:00:00") {

                              $sql "UPDATE bsptabelle SET abstracttime='nachts' WHERE ID='$id'";
                              mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              elseif (
                              $time "06:00:00" && $time <= "12:00:00") {

                              $sql "UPDATE bsptabelle SET abstracttime='vormittags' WHERE ID='$id'";
                              mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              elseif (
                              $time "12:00:00" && $time <= "14:00:00") {

                              $sql "UPDATE bsptabelle SET abstracttime='mittags' WHERE ID='$id'";
                              mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              elseif (
                              $time "14:00:00" && $time <= "18:00:00") {

                              $sql "UPDATE bsptabelle SET abstracttime='nachmittags' WHERE ID='$id'";
                              mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              else 
                              {
                              $sql "UPDATE bsptabelle SET abstracttime='abends' WHERE ID='$id'";
                              mysql_query($sql) or die("Anfrage nicht erfolgreich");

                              }

                              ?>

                              Kommentar

                              Lädt...
                              X