Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Datum vorausberechnen? [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Datum vorausberechnen?


 
SusiSorglos
03-07-2010, 12:34 
 
Hallo,
ich habe wieder ein Problem wo ich nicht weiter weis.

Ich möchte gerne mittels (INTERVAL) Datensätze zwischen StartDatum und EndDatum ausgeben lassen. Dieses FifferenzDatum sollte genau 1 Monat sein.

Also z.B. User meldet sich am 15.02.2009 an, jetzt möchte ich gerne das er alle Datensätze im AKTUELLEN Monat, dem 15.06.2010 und dem 15.07.2010 aufgelistet bekommt. Ich habe es so einigermaßen hinbekommen aber das ist leider etwas zu ungenau. Ich habe die Tage von Anmeldedatum bis Heute durch 30.42 Tage geteilt. Und das ganze dann mittels CEIL gerundet. Diesen Wert habe ich dann in meinem SQLQuery genutzt. Nur leider ist diese Methode zu ungenau.

Gibt es dafür vielleicht eine bessere Möglichkeit?



$sql = "SELECT DATEDIFF(NOW(), anmeldung) as differenz ";
$sql .= "FROM `user` WHERE `id` = '123456789' LIMIT 1";
$query0 = mysql_query($sql, $db_connect);
$diffmonat = mysql_fetch_row($query0);
$calcmonat = ceil($diffmonat['0']/30.42-1);



$sql = "SELECT *, ";

$sql .= "DATE_FORMAT(anmeldung, '%d.%m.%Y - %H:%i') AS fanmeldung, ";
$sql .= "DATE_FORMAT(indexend, '%d.%m.%Y - %H:%i') AS findexend, ";
$sql .= "DATE_ADD(indexend, INTERVAL `ival` DAY) AS indexnext, ";

$sql .= "DATE_ADD(anmeldung, INTERVAL ".$calcmonat." MONTH) AS startmonat, ";
$sql .= "DATE_ADD(anmeldung, INTERVAL ".$calcmonat."+1 MONTH) AS endemonat, ";

$sql .= "FROM user ";
$sql .= "left join kunden ON kunden.id = user.id ";
$sql .= " WHERE `user`.`id` = '123456789' LIMIT 1";


Cu SusiSorglos

 
AmicaNoctis
03-07-2010, 12:46 
 
Hallo,

bitte Beitrag bearbeiten und nur den reinen SQL-Code darstellen. PHP-Code stört in diesem Unterforum nur bei der Fehlersuche.

Gruß,

Amica

 
onemorenerd
03-07-2010, 12:53 
 
Warum so umständlich?

SELECT ... WHERE col BETWEEN CURDATE() AND DATE_ADD(CURDATE(),30)

 
SusiSorglos
03-07-2010, 13:04 
 
ich glaube das ist nicht ganz das was ich suche, oder?

Ich möchte aus dem Verlauf vom 15.02.2009 einen Bereich ausgeben. Das wäre bei heutigen Datum [03.07.2010] also der Bereich 15.06.2010 - 12:00:00 bis 15.07.2010 - 11:59:59 Uhr.

 
AmicaNoctis
03-07-2010, 13:18 
 
Du hast immer noch nicht deinen Code angepasst.

 
SusiSorglos
03-07-2010, 13:23 
 
??? :eek: unverständnis....

Ich habe nun den Code auf die geforderten 100 Zeichen begrenztzt (hoffe ich).

Das mit dem PHP-Code verstehe ich nicht (oder will ich nicht verstehen) :D
Wenn ich den noch raus nehme, versteht doch keiner mehr den Code!?

Cu SusiSorglos

 
AmicaNoctis
03-07-2010, 13:31 
 
Wenn ich den noch raus nehme, versteht doch keiner mehr den Code!?

Das sagst du, aber ich versteh den auch so nicht. Wozu brauchst du das Anmeldedatum? Wieso liegt der Bereich den du ausgeben willst, im Zeitraum zwischen vor 2 Wochen und 2 Wochen in der Zukunft? Hast du dafür schon Daten? Warum nicht die letzten 4 Wochen oder den letzten Monat anzeigen? Deine Problembeschreibung ist also nicht so ganz nachvollziehbar.

 
SusiSorglos
03-07-2010, 13:45 
 
Finde ich schon..

Beispiel. Du hast einen DSL Vertrag abgeschlossen.. Der beginnt doch auch nicht immer am 01.01.2010. Sondern Du bekommst deine Rechnung doch sicherlich auch immer zu einem bestimmten Datum. Also am 03.07. und dann am 03.08 usw.usw. Und da ein Monat nicht immer gleich viele Tage hat, ist es zudem noch etwas schwer zu berechnen.

 
AmicaNoctis
03-07-2010, 14:28 
 
Jetzt hab ich erstmal verstanden, was du meinst.

Ganz ohne PHP-Code, so in etwa?:

where `irgendwas` between
str_to_date(concat_ws('-', year(curdate()), month(curdate()), day(`anmeldung`)), '%Y-%m-%d')
+ interval 0 day -- Überlaufkorrektur
- interval if(day(curdate()) < day(`anmeldung`), 1, 0) month
and
str_to_date(concat_ws('-', year(curdate()), month(curdate()), day(`anmeldung`)), '%Y-%m-%d')
+ interval 0 day -- Überlaufkorrektur
+ interval if(day(curdate()) <= day(`anmeldung`), 0, 1) month

 
derHund
03-07-2010, 14:32 
 
Jetzt wirds anschaulich, was du willst.

Du musst lediglich zum Anmeldedatum die Anzahl der seitdem vergangenen Monate addieren, dann hast du sowohl Unter- als auch Obergrenze. Etwas aufwendiger wird wohl die Berechnung der vergangenen Monate - ich kenne nur Funktionen zur Berechnung der vergangenen Tage, was aber auch genügt, da du daraus schätzen kannst, wieviel Monate es sind. Über ein paar einfache Vergleiche solltest du die Grenzen daraus leicht bestimmen können.

€: siehe Beitrag AmicaNoctis über mir

 
SusiSorglos
03-07-2010, 14:40 
 
Vielen Dank soweit,

mal sehen ob ich es so umgesetzt bekomme das es dann auch richtig bei mir läuft. Verstehe den Code noch nicht so ganz und muss ihn erst mal anhand der Manu verstehen.

Ich konnte es zwischenzeitlich mit PHP perfekt lösen. Den Code poste ich hier nun nicht, weil wie wir gelernt haben, ist es ja PHP und kein SQL Code:D
Werde aber dennoch die SQL-Variante versuchen anzuwenden, aus lernzwecken :D

Cu SusiSorglos

 
AmicaNoctis
03-07-2010, 14:47 
 
Hab den Code nochmal korrigiert, die Vergleiche waren falsch herum.

Edit: nochmal korrigiert, sie waren doch richtig. Setzt mir doch die Hitze zu? *grübel*

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:58 Uhr.