Zur Navigation

Abfrage von Timestamp-Felder zu Date-Formatfeld ändern

1 webuser

Hallo,
ein Script fragt die Felder "start_day" und "end_day" im Timestamp Format ab. Ich habe aber die Felder "von" und "bis" im DATE Format.

Es wird bei meiner Umstellung aber nichts angezeigt.

Gruß
Webuser
 
//Original $current_epoch = mktime(0,0,0,$month,$list_day,$year);
           $current_epoch = date('Y-m-d', strtotime($year-$month-$list_day));

// Original $sql = "SELECT * FROM $tablename WHERE $current_epoch BETWEEN start_day AND end_day";
            $sql = "SELECT * FROM $tablename WHERE $current_epoch BETWEEN von AND bis";
                      

                        $result = mysqli_query($conn, $sql);

                    if (mysqli_num_rows($result) > 0) {
                            // output data of each row
                            while($row = mysqli_fetch_assoc($result)) {

                                    $calendar .= "<b>" . $row["item"] . "</b><br>ID: " . $row["id"] . "<br>" . $row["name"] . "<br>" . $row["phone"] . "<br>";
                                }

13.12.2016 23:03

2 Jörg Kruse

Werte im DATE-Format müssen wie Strings in Hochkommata eingeschlossen werden:

$sql = "SELECT * FROM $tablename WHERE '$current_epoch' BETWEEN von AND bis";

Bei leeren Resultaten kann mit mysqli_error() ggf. auch überprüfen, ob die Query fehlerhaft ist

14.12.2016 09:27

3 webuser

Hallo,
das war es nicht.

mit dem Code
 $sql = "SELECT name, unix_timestamp(str_to_date(von,'%Y-%m-%d')) as vonx, unix_timestamp(str_to_date(bis,'%Y-%m-%d')) as bisx FROM $tablename WHERE '$current_epoch' BETWEEN vonx AND bisx";
und dem Prüfen wird nichts gezeigt, (auch nicht das Wort "datensätze")
  if (mysqli_num_rows($result) > 0) {
                     echo "datensätze". mysql_num_rows( $result );
In den Timestamps vonx und bisx sind richtige Werte und $current_epoch, $tabellenname sind auch
gefüllt. Ich nehme an, das bei der sql Abfrage die Kommasetzung oder
Hochkomma nicht richtig ist.

Gruß
Webuser

15.12.2016 19:17

4 Jörg Kruse

strtotime($year-$month-$list_day)

Hier ziehst du die Werte voneinander ab, also 2016 - 12 - 16 = 1988!

Einen String '2016-12-16' erhältst du eher so:

strtotime($year . '-' . $month . '-' . $list_day)

wobei ich mich frage, warum du diesen Datum-String nicht direkt nutzt, sondern mit strtotime() und date() hin- und herkonvertierst?

Wenn es dir um die führenden Nullen geht, kannst du diese mithilfe von sprintf() erzeugen:

sprintf("%04d-%02d-%02d", $year, $month, $list_day);

Wenn auch diese Korrektur nicht hilft, würde ich zum Debuggen 1. die Query ausgeben:

echo $sql;

und 2. etwaige Fehler mit mysqli_error() ausgeben lassen (direkt nach mysqli_query())

16.12.2016 09:59 | geändert: 16.12.2016 10:01

1 Forenmitglied fand diesen Beitrag gut

5 webuser

Hallo,
ich habe die Lösung gefunden:

  $sql = "SELECT von, bis name FROM $tablename WHERE $current_epoch BETWEEN unix_timestamp(str_to_date(von,'%Y-%m-%d')) AND unix_timestamp(str_to_date(bis,'%Y-%m-%d'))";

Danke für die Unterstützung
Gruß
Webuser

17.12.2016 15:09

6 Jörg Kruse

Dann befindet sich in $current_epoch jetzt aber auch ein Unix Timestamp?

Falls die Datenbanktabelle mal größer wird, kann sich diese mehrfache Konvertierung in dem WHERE Statement allerdings als problemetisch herausstellen. Die Erstellung eines Indexes auf `von` oder `bis` zur Beschleunigung der Abfrage wäre dann wirkungslos.

str_to_date(von,'%Y-%m-%d')

Also ist `von` gar nicht im DATE-Format definiert, sondern dort sind Datum-Strings gespeichert, die erst noch ins DATE-Format konvertiert werden müssen? Wenn ersteres, würde ein "unix_timestamp(von)" ausreichen

Falls `von` und `bis` im DATE-Format definiert sein sollten, würde ich die Query aber auch eher so gestalten:

$current_epoch = sprintf("%04d-%02d-%02d", $year, $month, $list_day);

$sql = "SELECT von, bis, name FROM $tablename WHERE '$current_epoch' BETWEEN von AND bis";

Das wäre performanter, da nur einmal in PHP konvertiert wird, statt durch MySQL bei jedem Datensatz in der Tabelle

17.12.2016 16:35

1 Forenmitglied fand diesen Beitrag gut

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]