Dynamische Datums ermittlung
Dennis R.
- php
Hallo,
ich stehe vor einem Problem, wo mir einfach kein Lösung einfallen möchte.
Folgendes:
Ich habe eine Db Tabelle Liefertage.
Liefertage
Tour | Tag
---------------
01 | 4
02 | 1
... | ...
wobei die Tage 1 = Montag... 7 = Sonntag sein sollen.
Ich möchte nun das heutige Datum nehmen vergleich welcher Tag ist und somit das Ausliefer Datum errechnen.
Hierfür will mir aber einfach kein Script einfallen :-(
Danke für eure Hilfe
MfG
Dennis
Mahlzeit Dennis R.,
Liefertage
Tour | Tag
01 | 4
02 | 1
... | ...wobei die Tage 1 = Montag... 7 = Sonntag sein sollen.
Ich möchte nun das heutige Datum nehmen vergleich welcher Tag ist und somit das Ausliefer Datum errechnen.
Und anhand welcher Kriterien? Was bringt Dir die Erkenntnis, dass der Wert des heutigen Tages (z.B. "Donnerstag" = 4) ist? Welches Auslieferdatum soll sich daraus ergeben?
Irgendwie ist mir Deine Problemstellung noch nicht klar.
MfG,
EKKi
Hallo,
Nein so war das nicht gemeint.
Er soll schaun welches Datum ist heut. 24.07.2008 ein Do.
Tour 01 fährt aber nur Mo. ... also soll er das Datum für kommenden Montag errechnen.
So war meine Frage gemeint. Sorry wenn ich mich falsch ausgedrückt habe.
Hi,
mit date-modify() veränderst du das Datum, z.b um einen Tag. (1 day). Damit du auf das richtige neue Datum kommst, brauchst du die Differenz zwischen dem heutigen Wochentag und dem Ausliefer-Wochentag in Tagen. Dabei gibt es einen kleinen Haken, nämlich wenn der Ausliefer-Wochentag > heutiger Wochentag ist. Aber auch das solltest du mit etwas Nachdenken lösen können.
So, und wie man an den Wochentag kommt, welcher mit 0 beginnt für Sonntag, kannst du unter getdate() ersehen.
Ciao, Frank
Danke für deinen Tipp Frank :)
Ich wert das ganze mal ausprobieren :)
MfG
Dennis R.
Hallo,
wenn schon die Skriptsprache und wahrscheinlich auch Deine Datenbank die Tage in 0=Sonntag bis 6=Samstag berechnet, dann solltest Du das auch tun.
Ansonsten musst Du immer erst den Rückgabewert umrechnen.
Hier mal ein Beispiel wie Du Dein Problem lösen könntest:
SELECT DATE_FORMAT(DATE_ADD(NOW, IF((DATE_FORMAT(NOW(),'%w')-Tag)<0), 7+DATE_FORMAT(NOW(), DATE_FORMAT(NOW(),'%w')-Tag) DAYS),'%d.%m.%Y') AS datum
FROM Tabelle
WHERE Tour=01;
*PS: nicht getestet!
Ich habe das jetzt noch getestet und hier ist die funktionierende Abfrage
SELECT
DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL IF((DATE_FORMAT(NOW(),'%w')-tag<0), 7+DATE_FORMAT(NOW(),'%w')-tag, DATE_FORMAT(NOW(),'%w')-tag) DAY),'%d.%m.%Y') AS datum
FROM touren
WHERE tour_id=5
Gruß
Roland
echo $begrüßung;
wenn schon die Skriptsprache und wahrscheinlich auch Deine Datenbank die Tage in 0=Sonntag bis 6=Samstag berechnet, dann solltest Du das auch tun.
SELECT DATE_FORMAT(DATE_ADD(NOW, IF((DATE_FORMAT(NOW(),'%w')-Tag)<0), 7+DATE_FORMAT(NOW(), DATE_FORMAT(NOW(),'%w')-Tag) DAYS),'%d.%m.%Y') AS datum
Die Umrechnung von 0=So auf 0=Mo lässt sich einfacher gestalten: (Wochentag + 6) % 7. Damit verschiebt sich zunächst der So auf 6, Mo auf 7, Di auf 8, usw. und die Modulooperation bringt Mo auf 0, Di auf 1, usw. und lässt den So auf 6. Außerdem kennt MySQL die Funktion WEEKDAY(), die Ergebnisse von Mo=0 bis So=6 liefert.
echo "$verabschiedung $name";
Hallo!
Natürlich gehts das, aber wenn ich mir das Ganze ersparen kann, dann erspar ich mir das lieber.
Aber Du kannst die Abfrage natürlich nach Deinen Wünschen umgestalten.
Gruß
Roland
Hey Danke für eure Hilfe :)
...Ich hätte jetzt erwartet das das ein wenig komplizierter ist *lach*
Naja so ist das halt in der Lernphase...
Also vielen dank an alle die hier so vielseitige und vielzählige lösungen beigetragen haben.
MfG
Dennis R.
Also vielen dank an alle die hier so vielseitige und vielzählige lösungen beigetragen haben.
interessant wäre jetzt vor allem für welche lösung du dich nach dem lesen aller beiträge entschieden hast - rein objektiv betrachtet ist keine der genannten methoden wirklich geeignet (meine auch nicht, wie ich schon festgestellt habe) sondern nur eine kombination der genannten möglichkeiten
es liegt an dir, diese kombination zu erstellen und dann bitte ich dich darum, uns nicht dumm sterben zu lassen bzw eher andere leute, die auch danach suchen und dann auf diesen thread im forumsarchiv stossen ;)
nach möglichkeit diesen und den vorherigen post löschen, hab grade in gestiger umnachtung auf einen falschen diskussionfaden ohne bezug zum inhalt geantwortet :D
Hey
Habe mich noch nicht entschieden :)
werde denk ich alle Möglichkeiten im laufe diesen Tages durchspielen und dann nach und nach ausschliessen.
Bis ich das Benutzerfreundlichste gefunden habe ^^
Aber Ich find es erstaunlich das PHP und mysql immer direkt für solche dinge was mitbringen :) und man nicht erst kompliziert mehrere Zeilen Script schreiben muss um ans Ziel zukommen.
MfG
Dennis R.
werde denk ich alle Möglichkeiten im laufe diesen Tages durchspielen und dann nach und nach ausschliessen.
hallo - ich finds faszinieren, dass nicht nur ich banane bin :D du antwortest offenbar auf eine antwort die nichts mit dem rest zu tun hat und bist öffenbar auch überzeugt, dass sie passt ;)
Moin ohja so bin ich eben :D
Da haben sich zwei gefunden nicht Wahr suit ;D
Hier mein Script das ich nun gebastelt habe. Ist vllt nicht sehr elegant gelöst aber es funktioniert und das reicht mir :)
Script:
<?php
include('datenbank.php');
if($databasepointer)
{
//Zu Testzwecken auf 25 gesetzt im echt System wird der Eintrag vom system übergen
//weißt auf einen Datensatz
$sid = "25";
//Ermittelt den heutigen Wochentag
$heute = getdate();
//schreibt den heutigen Wochentag aus dem string in eine variable
$tag_heute = $heute['wday'];
//Abfrage der Datenbank zur Ermittlung wo hingeliefert werden soll
$abfrage = "SELECT Filialeid FROM $tabelle WHERE sid = $sid";
$result = mysql_query($abfrage);
while($row = mysql_fetch_array($result))
{
$filialid = $row['Filialeid'];
}
//Ermittlung des Liefertages
$abfrage = "SELECT tag FROM $tabelle WHERE Filialeid = $filialid";
$result = mysql_query($abfrage);
while($row = mysql_fetch_array($result))
{
$liefer_tag = $row['tag'];
}
//Ermittelt die Differenz
$zaehler = 0;
//Differenz wird errechnet
while($tag_heute != $liefer_tag)
{
$zaehler++;
if($liefer_tag == 7 && $tag_heute == 7)
{
break;
}
if($tag_heute == 7)
{
$tag_heute = "0";
}
$tag_heute++;
}
//Definiert das Jahr
$year = date("Y");
//Definiert das heutige Datum
$heute = date("j.n.Y");
//Datum wird hochgerechnet
$heute = $heute + $zaehler;
//das Jahr wird angefügt, da es bei der berechnung irgendwie verloren geht
$heute .= ".$year";
$lieferdatum = $heute;
echo "<br><br>Lieferdatum: $lieferdatum\n";
}
else
{
echo "Es konnte keine Verbindung zur Datenbank Hergestellt werden.";
}
?>
Schaut es euch an... vllt findet Ihr ja noch verbesserungen... Bestimmt findet Ihr welche :)
echo $begrüßung;
Hier mein Script das ich nun gebastelt habe. Ist vllt nicht sehr elegant gelöst aber es funktioniert und das reicht mir :)
Den meisten (oft auch Fortgeschrittenen) scheint es zu reichen, wenn "funktioniert" die Mindestfunktionalität umfasst, die sie sich vorgestellt haben, übersehen aber gern dabei, dass manchmal noch weit mehr möglich ist, und sie sich dessen Auswirkungen nicht vorgestellt haben, geschweige denn sich diese wünschen.
Schaut es euch an... vllt findet Ihr ja noch verbesserungen... Bestimmt findet Ihr welche :)
Natürlich.
//weißt auf einen Datensatz
den Maler anweisen, die Wand zu weißen (Nein, ich werde jetzt nicht alle Rechtschreibfehler in den Kommentaren anschwärzen.)
//Zu Testzwecken auf 25 gesetzt im echt System wird der Eintrag vom system übergen
$sid = "25";
$abfrage = "SELECT Filialeid FROM $tabelle WHERE sid = $sid";
Hier hast du eine SQL-Injection-Lücke. Da der Inhalt von $sid im Nicht-Test-Fall sonstwoher kommt, und du ihn nicht kontrolliert hast, ist das Statement beliebig erweiterbar. Mit intval() wird ein Integerwert erzwungen. mysql_real_escape_string() kann auch helfen, aber dann die Quotes nicht vergessen, sonst bringt das nichts: Siehe https://forum.selfhtml.org/?t=174351&m=1145197
$result = mysql_query($abfrage);
while($row = mysql_fetch_array($result))
Auch sehr üblich: Du hast nicht mit einkalkuliert, dass mysql_query() misslingen kann. Es gibt dann false zurück, was aber kein gültiges Argument für mysql_fetch_array() ist und mit einer PHP-Fehlermeldung geahndet wird. Überprüfe jedes Funktionsergebnis auf Fehlerhinweise gemäß den Informationen im PHP-Handbuch und reagiere angemessen, unter anderem auch aus der Sicht des Anwenders. die() ist beispielsweise keine Fehler_behandlung_, schon gar keine anwenderfreundliche.
{
$filialid = $row['Filialeid'];
}
Warum verwendest du überhaupt eine Schleife zum Abfragen, wenn du nur ein Ergebnis erwartest?
$abfrage = "SELECT tag FROM $tabelle WHERE Filialeid = $filialid";
$result = mysql_query($abfrage);while($row = mysql_fetch_array($result))
{
$liefer_tag = $row['tag'];
}
Das selbe in grün. Beide Anfragen können übrigens in einer zusammengefasst werden. Du holst dir mit der sid die Filialeid, nur um dir von dieser den tag zu holen. Da kannst du dir gleich den tag von der sid holen.
//Differenz wird errechnet
Ein interessanterer Kommentar wäre gewesen, warum sie berechnet werden muss, und auf welcher Grundlage das passiert. Dann kann man sogar als Außenstehender (und das wirst auch du nach ein paar Wochen des Vergessens sein) nachvollziehen, ob diese Rechnung das gewünschte Ergebnis bringt und auch keine Nebenwirkungen hat. Eine fachlich Prüfung der Berechnung überspringe ich deswegen.
//Definiert das Jahr
$year = date("Y");
//Definiert das heutige Datum
$heute = date("j.n.Y");
//Datum wird hochgerechnet
$heute = $heute + $zaehler;
//das Jahr wird angefügt, da es bei der berechnung irgendwie verloren geht
$heute .= ".$year";
Na, das ist ja auch kein Wunder. date() gibt einen String zurück. Es ist nun kein Datum oder Zeitwert mehr, mit dem man rechnen könnte. PHP versucht aus dem String eine Zahl zu erkennen, um dann damit die Addition durchführen zu können. Dass dabei der Teil nach dem zweiten Dezimalpunkt verloren geht, ...
Wenn du heute + x Tage haben möchtest, kannst du in PHP die Funktion strtotime() verwenden. Die liefert dir einen berechneten Timestamp-Wert, den du dann mit date() formatieren kannst. Mit strtotime() sind auch Berechnungen à la "next Thursday" einfach erledigt.
$lieferdatum = $heute;
Ach was! $lieferdatum = berechnung($heute) wäre auch sprachlich sinnvoller gewesen als $heute zu verfälschen.
{
echo "Es konnte keine Verbindung zur Datenbank Hergestellt werden.";
}
Na immerhin ein Reagieren auf Fehler. Wenn mir auch als Anwender nur bleibt mit den Schultern zu zucken, und mich woanders nach einen umzusehen, der liefern kann.
Besser fände ich es, nach dem Motto: "Das Lieferdatum kann momentan nicht ermittelt werden. In der Regel beträgt die Lieferzeit jedoch x Tage. Bei Fragen wenden Sie sich bitte an: ..."
echo "$verabschiedung $name";
Und hier noch mal die Lösung so das Sie weiter "Oben" steht...
Hier mein Script das ich nun gebastelt habe. Ist vllt nicht sehr elegant gelöst aber es funktioniert und das reicht mir :)
Script:
<?php
include('datenbank.php');
if($databasepointer)
{
//Zu Testzwecken auf 25 gesetzt im echt System wird der Eintrag vom system übergen
//weißt auf einen Datensatz
$sid = "25";
//Ermittelt den heutigen Wochentag
$heute = getdate();
//schreibt den heutigen Wochentag aus dem string in eine variable
$tag_heute = $heute['wday'];
//Abfrage der Datenbank zur Ermittlung wo hingeliefert werden soll
$abfrage = "SELECT Filialeid FROM $tabelle WHERE sid = $sid";
$result = mysql_query($abfrage);
while($row = mysql_fetch_array($result))
{
$filialid = $row['Filialeid'];
}
//Ermittlung des Liefertages
$abfrage = "SELECT tag FROM $tabelle WHERE Filialeid = $filialid";
$result = mysql_query($abfrage);
while($row = mysql_fetch_array($result))
{
$liefer_tag = $row['tag'];
}
//Ermittelt die Differenz
$zaehler = 0;
//Differenz wird errechnet
while($tag_heute != $liefer_tag)
{
$zaehler++;
if($liefer_tag == 7 && $tag_heute == 7)
{
break;
}
if($tag_heute == 7)
{
$tag_heute = "0";
}
$tag_heute++;
}
//Definiert das Jahr
$year = date("Y");
//Definiert das heutige Datum
$heute = date("j.n.Y");
//Datum wird hochgerechnet
$heute = $heute + $zaehler;
//das Jahr wird angefügt, da es bei der berechnung irgendwie verloren geht
$heute .= ".$year";
$lieferdatum = $heute;
echo "<br><br>Lieferdatum: $lieferdatum\n";
}
else
{
echo "Es konnte keine Verbindung zur Datenbank Hergestellt werden.";
}
?>
Schaut es euch an... vllt findet Ihr ja noch verbesserungen... Bestimmt findet Ihr welche :)