Ankündigung

Einklappen
Keine Ankündigung bisher.

DATEDIFF Mysql Datenbank

Einklappen

Neue Werbung 2019

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

  • DATEDIFF Mysql Datenbank

    Hallo,


    ich speichere in meiner Datenbank ein Datum (das Datum liegt in der Zukunft).
    Gerne würde ich von heute (immer dem aktuellen Datum (NOW) bis zum Datum welches in der Zukunft liegt die Differenz berechnen und in meiner Tabelle ausgeben.

    Ich habe gesehen, dass man dies mit dem DATEDIFF Befehl realisieren kann.


    Meine Tabelle:

    HTML-Code:
    
    
     <table id="tabelle" class="table table-bordered table-striped">
                    <thead>
                    <tr>
                      <th>ID</th>
                      <th>Datum Zukunft</th>
                      <th>Differenz</th>
                    </tr>
                    </thead>
    
                        <tbody>
                            <tr>  
                              <?php
                                    if($query)
                                    {
                                    foreach($query as $row)
                                    {
                                ?>
                                <td> <?php echo $row['id']; ?> </td>
                                <td> <?php echo $row['datum_zukunft']; ?> </td>
                                <td> <?php echo $row['datum_differenz']; ?> </td>                            
                            </tr>
                            <?php          
                                }
                              }
                            ?>
                    </tbody>
     </table>
    

    Wie müsste der Befehl lauten damit ich den Wert in
    HTML-Code:
    <td> <?php echo $row['datum_differenz']; ?> </td>
    ausgeben lassen kann und wo müsste ich den Befehl eintragen?
    Über Hilfe würde ich mich sehr freuen. Gibt es vllt. auch Alternativen, die das Vorhaben vereinfachen?

  • #2
    Jedenfalls nicht im PHP-Code, sondern im SQL-Code.

    Du kannst aber auch mit PHP Datumswerte berechnen. Siehe Doku zur DateTime-Klasse.

    Kommentar


    • #3
      Wenn ich jetzt einen Wert aus meiner Datenbank mit
      HTML-Code:
      <td> <?php echo $row['datum_differenz']; ?> </td>
      ausgebe, kann ich dann einfach beispielsweise mit PHP
      PHP-Code:
      date("Y/m/d"
      die beiden Werte von einander subtrahieren?
      Und diesen neuen Wert dann in meiner Tabelle ausgeben lassen? Ich benötige schon SQL da ich mehrere Daten berechnen muss, die in der SQL abgespeichert sind.

      Kommentar


      • #4
        Wenn du SQL verwenden willst, warum zeigst du dann im 1. Beitrag nicht die DB Tabelle und deine Versuche, anstatt uns hier mit HTML und PHP herumirren zu lassen.

        Erstelle ein Beispiel mit sqlfiddle und du bekommst eine Lösung dazu geliefert wie es mit DATEDIFF realisiert werden kann, oder schau ins Handbuch.

        Kommentar


        • #5
          Danke für den Hinweis, ich wusste nicht, dass es sowas auch für SQL gibt.
          Anbei einmal die Datenbank: http://sqlfiddle.com/#!9/667d9cb/1

          Und der Code:

          Schema
          Code:
          CREATE TABLE Datum (
            id int not null,
            datum_heute date,
            datum_zukunft date,
            datum_differenz_in_tage int);
          
          INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('1',NOW(),'21.01.09','1');
          INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('2',NOW(),'21.01.10','2');
          INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('3',NOW(),'21.01.11','3');
          INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('4',NOW(),'21.01.12','4');
          Run SQL
          Code:
          SELECT id, DATE_FORMAT(datum_heute, '%d.%m.%Y'),  DATE_FORMAT(datum_zukunft, '%d.%m.%Y'),datum_differenz_in_tage
          FROM Datum
          
          
          
          # DATEDIFF mein Ansatz:
          # DATEDIFF (day, datum_heute, datum_zukunft) bei datum_differenz_in_tage einsetzen.
          # Error: Datediff kann nicht gefunden werden
          DATEDIFF habe ich leider nicht ganz hinbekommen, aber meinen Ansatz hingeschrieben.



          Eine Frage dazu: Wenn ich meine Differenz in der Tabelle in der Spalte "datum_differenz_in_tage" habe kann ich die in meinem PHP Code mit
          Code:
          <td> <?php echo $row['datum_differenz_in_tage']; ?> </td>
          ausgeben lassen. Berechnet der Code in SQL die Differenz der beiden Daten für jeden Tag dann automatisch? Sodass sich die Zahl der Differenz jeden Tag aktualisiert?

          Kommentar


          • #6
            Fragen über Fragen ...
            • warum Spalte mit "Datum heute"? Das ist immer aktuell berechenbar und morgen nicht mehr gültig
            • warum liegt Dein Datum_zukunft in der Vergangenheit?
            • warum eine Spalte datum_differenz_in_tage, das ist a) berechenbar und die die Spalte datum_heute morgen aktualisiert wird ist dann dann morgen auch ungültig


            Code:
            test=# CREATE TABLE Datum (
            test(#   id int not null,
            test(#   datum_heute date,
            test(#   datum_zukunft date,
            test(#   datum_differenz_in_tage int);
            CREATE TABLE
            test=*#
            test=*# INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('1',NOW(),'21.01.09','1');
            INSERT 0 1
            test=*# INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('2',NOW(),'21.01.10','2');
            INSERT 0 1
            test=*# INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('3',NOW(),'21.01.11','3');
            INSERT 0 1
            test=*# INSERT INTO Datum (id,datum_heute,datum_zukunft,datum_differenz_in_tage) VALUES ('4',NOW(),'21.01.12','4');
            INSERT 0 1
            test=*# select * from datum ;
             id | datum_heute | datum_zukunft | datum_differenz_in_tage
            ----+-------------+---------------+-------------------------
              1 | 2021-01-08  | 2009-01-21    |                       1
              2 | 2021-01-08  | 2010-01-21    |                       2
              3 | 2021-01-08  | 2011-01-21    |                       3
              4 | 2021-01-08  | 2012-01-21    |                       4
            (4 rows)
            
            test=*# select id, datum_heute, datum_zukunft, datum_zukunft - datum_heute as differenz from datum ;
             id | datum_heute | datum_zukunft | differenz
            ----+-------------+---------------+-----------
              1 | 2021-01-08  | 2009-01-21    |     -4370
              2 | 2021-01-08  | 2010-01-21    |     -4005
              3 | 2021-01-08  | 2011-01-21    |     -3640
              4 | 2021-01-08  | 2012-01-21    |     -3275
            select Kaffee ...
            PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

            Kommentar


            • #7
              Danke für deine Antwort. Im eifer des Gefechts habe ich ein vergangenes Datum in datum_zukunft eingetragen. Da gebe ich dir Recht. Da müsste eins aus der Zukunft stehen.

              Code:
              CREATE TABLE Datum (
              id int not null,
              datum_zukunft date);
              
              INSERT INTO Datum (id,datum_zukunft) VALUES ('1','21.01.20');
              INSERT INTO Datum (id,datum_zukunft) VALUES ('2','21.01.21');
              INSERT INTO Datum (id,datum_zukunft) VALUES ('3','21.01.22');
              INSERT INTO Datum (id,datum_zukunft) VALUES ('4','21.01.23');
              Code:
              select id, DATE_FORMAT(datum_zukunft, '%d.%m.%Y') - DATE_FORMAT(NOW(), '%d.%m.%Y') as differenz from datum ;

              Jetzt passt es. Mit dem Code wird auch jeden Tag für NOW() das aktuelle Datum ausgegeben, sodass sich die Differenz jeden Tag aktualisiert?

              Kommentar


              • #8
                Zitat von Sebbi85 Beitrag anzeigen
                Danke für deine Antwort. Im eifer des Gefechts habe ich ein vergangenes Datum in datum_zukunft eingetragen. Da gebe ich dir Recht. Da müsste eins aus der Zukunft stehen.


                Jetzt passt es. Mit dem Code wird auch jeden Tag für NOW() das aktuelle Datum ausgegeben, sodass sich die Differenz jeden Tag aktualisiert?
                das ist der Sinn von now() ... man sollte nur beachten, daß now() den Startzeitpunkt der aktuelle Transaktion ausgibt, falls die Transaktion also über Mitternacht geht und die die wirklich aktuelle Zeit haben willst dann eher clock_timestamp().
                PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

                Kommentar


                • #9
                  Warum hampelst du die ganze Zeit mit DATE_FORMAT() herum? Das ist bei einer Berechnung kontraproduktiv.

                  Und '21.01.20' ist aus Sicht der Datenbank kein Datum, sondern einfach nur Text.

                  Du solltest dich an die vorgegebenen Regeln der Datenbank halten und nicht freestylemäßig einfach irgendwas machen.

                  Kommentar


                  • #10
                    Okay danke NOW() passt dann.

                    Noch eine letzte Frage: Ich habe jetzt das DATE_FORMAT rausgenommen und es so wie akretschmer in SQLFiddle eingetragen:

                    Code:
                    CREATE TABLE Datum (
                    id int not null,
                    datum_zukunft date);
                    
                    INSERT INTO Datum (id,datum_zukunft) VALUES ('1','2021-01-21');
                    INSERT INTO Datum (id,datum_zukunft) VALUES ('2','2021-01-21');
                    INSERT INTO Datum (id,datum_zukunft) VALUES ('3','2021-01-21');
                    INSERT INTO Datum (id,datum_zukunft) VALUES ('4','2021-01-21');
                    Code:
                    select id, datum_zukunft - NOW() as differenz from datum ;
                    Erhalte für meine Tage? aber folgende Ausgabe:
                    -20210087881422
                    Woran liegt das? Jetzt doch am Format?

                    http://sqlfiddle.com/#!9/5cb933/1

                    Kommentar


                    • #11
                      Habe es jetzt mit
                      Code:
                      select id, DATEDIFF(datum_zukunft, NOW()) as differenz from datum ;
                      gelöst. Vielen Dank für die Hilfe.

                      Kommentar

                      Lädt...
                      X