Datum

  • Hallo,


    ist folgendes mit PHP möglich? Ich habe ein Datum 02.03.2015 (steht so in der Datenbank) in einem weiteren Feld steht eine Zahl, diese muss darauf gerechnet werden und die Ausgabe sollte dann lauten "Dein Projekt läuft noch 23 Tage" Wenn ich unter einem Tag bin, sollte eine andere Meldung kommen die dann heißt "Dein Projekt läuft noch 21h und 33min.

  • Möglich ja, wobei du das schon genauer ausführen musst.
    Eine Zahl? Was gibt diese Zahl an? (Sekunden, Minuten, Stunden, Tage, Jahre, Birnen, Äpfel...)


    Ich würd statt einer Zahl dort das Enddatum angeben , und ebenfalls im gleichen Zeitformat speichern.
    Dann kannst du dir die Differenz bequem per SQL ausrechnen lassen
    und dann nur noch eine Ausgabart per PHP definieren.


    Am feinsten wird es vermutlich durch einen Timestap-Diff
    in Minuten bei dem du erst prüfst ob er größer als ein Tag ist und dann das Ganze in ein schönes Format bringst :)


    Edit: GIbt es eine maximale Länge für Projekte? , den bei unter 900 Stunden dürfte sich noch TIMEDIFF anbieten.

  • "02.03.2015" ist schon mal schlecht.


    Wenn man ein Datum (+Zeit) in einer Tabelle ablegen will, dann sollte man den Typ DATETIME nutzen.
    Sieht dann in etwa so aus:
    2015-03-04 01:01:01
    jahr-monat-tag stunden:minuten:sekunden


    Wenn Du zB in PHP die Funktion time() nutzt, dann schickst Du den Wert (die Zahl von time()) so in die Tabelle:

    PHP
    <?php
    $sql = "
    INSERT INTO `db`.`tabelle` 
    SET `zeit`= FROM_UNIXTIME(" . time() . ")
    ";


    und das Ganze andersrum

    PHP
    <?php
    $sql = "
    SELECT UNIX_TIMESTAMP(`zeit`) AS `zeit`
    FROM `db`.`tabelle` 
    WHERE ...
    ";


    Damit kann man dann schon mal arbeiten.
    Wisst Du nun beim Auslesen den Wert aus dem anderen Feld dazu zählen, kann man:

    PHP
    <?php
    $sql = "
    SELECT 
        UNIX_TIMESTAMP(`zeit`) + `das_weitere_feld` AS `zeit` -- bsp: UNIX_TIMESTAMP('2015-03-04 14:29:21') == 1425475761 + das_weitere_feld
    FROM `db`.`tabelle` 
    WHERE ...
    ";


    Es geht auch vor Umwandlung von DATETIME zu UNIXTIME:

    SQL
    SELECT DATE_ADD(`date_status`,INTERVAL 1 DAY)


    Aber das macht nicht wirklich Sinn, wenn Du in dem anderem Feld eine Zahl (ich Tippe auf Sekunden) stehen hast.


    Was steht denn in dem Anderen Feld für eine Zahl? Sekunden?



    BTW: Viele viele Möglichkeiten: http://dev.mysql.com/doc/refma…e-and-time-functions.html

  • Hallo,


    vielen Dank für deine sehr ausführliche Erklärung. Dann ändere ich also das Datum in DATETIME. Das Feld mit der Zahl, da stehen Tage drin, also z.B. 90 für 90 Tage oder 7 für 7 Tage usw...


    Edit:


    Es müsste so gehen oder?


  • Ich würd hier in diesem Fall immer noch bevorzugen das ganze direkt SQl erledigen zu lassen.
    Zudem finde ich es logischer , ein Enddatum zu speichern statt dem Zeitraum vom Startdatum aus und das Startdatum.
    In so einem Fall empfiehlt es sich vielleicht anfangs nur das Enddatum zu speichern und mit dem jetztigen
    zu vergleichen, was sehr viel arbeitet spart.


    z.B. Start + Laufzeit direkt anfangs berechnen und das als Datetime in die Datenbank schreiben
    Dann die Differenz zwischem dem heutigen Tag und dem Ablauf direkt von SQl berechnen lassen
    und per php nur noch formatieren.


    Wozu denn PHP nutzen , für etwas das MySQL auch kann ^^

  • Das heißt also, mein PHP Code:


    PHP
    $day     = date("Y-m-d"); 
    $nextDay = strtotime("+35 day", strtotime($day)); 
    $neu =  date("Y-m-d", $nextDay);


    führe ich direkt beim Eintragen aus, dann hätte ich das Datum „2015-08-04“ in der Datenbank stehen? Das Startdatum kann ich nicht löschen, denn damit muss ich noch weiter arbeiten z.B. darf ein Projekt nur angezeigt werden, wenn das Datum nicht jünger als das heurige ist.


    Meine Projekte lese ich derzeit so aus:



    das heißt ich müsste hier das $stmt = $mysqli->prepare( ändern?

  • Doch, da das Startdatum dann ja irreleveant ist.


    Du musst im Grunde dann beim auslesen ein where-Klausel dranhängen:


    ungefähr so:


    SQL
    WHERE NOW()  > endzeitpunkt



    bzw in welchem Format speicherst du die Zeit denn? könnte eventuell auch CURDATE() statt NOW() nützlich sein :)

  • Ich weiß nicht ob wir gerade das gleiche meinen? Ich benötige nur bei der Ausgabe eine Zahl die mir anzeigt wie lange ein Projekt noch gültig ist. Verstehe nicht ,was das WHERE TIMESTAMPDIFF soll? Das währe ja nur nötig um Projekte die älter als endzeitpunkt sind, nicht mehr anzeigen zu lassen?

  • Ach du willst abgelaufene Projekte auch noch anzeigen lassen?


    die Dauer selbst ermittelst du so


    SQL
    SELECT TIMESTAMPDIFF(hours,NOW(),endzeit)


    Dort ggf. noch den Parameter anpassen , falls du was genaueres als Stunden brauchst :)

  • Nein, es geht mir _hier_ nicht darum ob ein Projekt abgelaufen ist und dieses dann ausgeblendet wird oder nicht ,mir geht es darum, dass ich bei meinem Projekt in der Übersicht ein Feld haben möchte mit der Anzeige, wie lange ein Projekt noch gültig ist. Was mit diesem danach passiert, ist noch eine ganz andere Geschichte.


    Edit:


    Meine Ausgabe habe ich jetzt so geändert, damit währe jetzt mal das Problem mit alten Projekten erledigt:



    Bekomme jetzt zwar diese Meldung " Warning: Invalid argument supplied for foreach() i" das liegt aber bestimmt an diesem Code:


    PHP
    $alleprojekte = alleProjekte($mysqli);
            foreach($alleprojekte as $array){?>


    da müsste ich bestimmt prüfen ob ein Datensatz überhaupt vorhandne ist. Mal schauen wie ich das machen kann.


    EDIT 2 um 22:53 Uhr


    Ok, die Fehlermeldung habe ich gelöst bekomme und zwar so:



    Die Ausgabe sieht dann so aus:



    Keine Ahnung ob das richtig ist, aber es funktioniert wohl.

  • So, ein Teil habe ich geschafft, meine Funktion sieht nun so aus:



    Die Ausgabe dann so:



    Jetzt habe ich noch eine Farge, wie bekomme ich mein letztes Problem gelöst, wenn ich unter einem Tag bin, dass die Anzeige dann von 1 Tage auf 23h 45min z.B. wechselt? Wenn das noch irgendwie möglich wäre, dann wäre alles wieder im grünen Bereich.


    EDIT: 00:17 Uhr


    Wie ich gesehen habe, kann ich mit

    PHP
    $stmt = $mysqli->prepare("SELECT TIMEDIFF(p_ende, NOW())AS DiffDate, [....]


    auf Stunden umstellen, jetzt ist die Frage wie bekomme ich beide zusammen, also

    PHP
    $stmt = $mysqli->prepare("SELECT DATEDIFF(p_ende, NOW())AS DiffDate, [.....]


    wenn ich _über_ 24 Stunden bin und wenn ich _unter_ 24 Stunden bin dann dieses:

    PHP
    $stmt = $mysqli->prepare("SELECT TIMEDIFF(p_ende, NOW())AS DiffDate, [....]


    oder kann ich das bei der Ausgabe in PHP umwandeln? Ich habe einfach keine Idee und weiß auch nicht nach was ich suchen muss.

  • Ich habe jetzt die halbe Nacht gelesen und es sieht so aus, dass MySQL das was ich benötige so nicht kann. Also kann ich die Ausgabe gleich mit PHP machen und nicht erst groß mit MySQL etwas rechnen zu lassen, was überhaupt nicht geht.

  • Hier mal eine Möglichkeit wie du an alle Daten kommst

    PHP
    <?php
    	$zeiten = [
    		'start' => '2014-12-21 18:20',
    		'now' => date('Y-m-d H:i',time()),
    		'end' => '2015-05-10 22:46',
    	];
    	echo "<pre>";
    	print_r(getTimeInfo($zeiten,true));
    	echo "</pre>";
    ?>


    Ausgabe:


    :)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!