php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.01.2009, 11:42  
Neuer Benutzer
 
Registriert seit: 14.01.2009
Beiträge: 14
web-producer befindet sich auf einem aufstrebenden Ast
Standard zeitliche Überschneidung erkennen

Hallo liebe PHP-Fans!

Nach nun mehr 8 Jahren PHP-Programmierung greife ich nun zum ersten Mal auf die Hilfe eines Forums zurück um nicht ganz verrückt zu werden. Mein aktuelles Projekt verlangt nach der Erstellung eines Leerstandsrechner für die Ermittlung von Energiekosten. Dazu gibt der User zunächst Monat und Jahr seines Abrechnungsintervalles ein (z. B. Januar 2004). Daraus ergeben sich 3 Berechnungsperioden, die jeweils 12 Monate haben und zwingend aufeinander folgend sind), also:

Januar 2004 - Dezember 2004
Januar 2005 - Dezember 2005
Januar 2006 - Dezember 2006

Diese Daten stehen mir bereits im Timestamp-Fomat zur Verfügung. Jede Periode wird einen unterschiedlichen Verbrauchswert an Energie bekommen.
Nun gibt der User an, er hätte z. B. ein Mehrfamilienhaus mit 600 m² beheizt. Und jetzt kommt der Leerzeitrechner ins Spiel. Er hat z. B. eine Leerzeit (also "unvermietet") von Oktober 2004 bis März 2005 von 50 m². Diese beiden Daten stehen mir ebenfalls im Timestamp zur Verfügung. Nun muss ich mit Hilfe von PHP erkennen, in welchem Zeitraum wieviele Monate fallen, da jede Abrechnungsperiode einen abweichenden Verbrauchswert haben wird. Schwierigkeit hierbei:

Der Leerstand kann
- vor der Abrechnungsperiode beginnen und in der Periode enden.
- vor der Abrechnungsperiode beginnen und danach enden.
- in der Abrechnungsperiode beginnen und darin enden.
- in der Abrechnungsperiode beginnen und danach enden.

Nachdem ich erkannt habe in welcher Leerstand in welcher Abrechnungsperiode fällt muss ich noch die Anzahl der Monate ermitteln. Nächste Schwierigkeit: Es gibt auch halbe Monate (Kündigung zum 15. oder zum 30.). Die weitere Berechnung (Erhöhung der Verbrauchswerte, da ja weniger Fläche beheizt wurde) bekomme ich dann schon wieder selbst hin.

Eine Idee von mir wäre die Abrechnungsperioden Tageweise in ein Array zu speichern und dann tageweise zu überprüfen, wieviel Tage des Leerstandes im Array zu finden sind. Das wird aber wahrscheinlich etwas länger dauern.

Kennt Ihr einen Lösungsansatz für eine elegantere Methode?
web-producer ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.01.2009, 12:56  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

kann es tatsächlich nur halbe und ganze Monate geben?
Und alles wird halbmonatsgenau berechnet?
HPR1974 ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:01  
Neuer Benutzer
 
Registriert seit: 14.01.2009
Beiträge: 14
web-producer befindet sich auf einem aufstrebenden Ast
Standard

Ja, da die meisten Kündigungsfristen für Wohnungen am ersten, 15. oder am letzten des Monats sind. Aber da es hier nur um hinterste Nachkommastellen geht werde ich wohl der einfachhalthalber auf die Unterscheidung zwischen ersten und letzten des Monats verzichten. Also kann der User als Tag nur "01." und "15." wählen.
web-producer ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:06  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Code:
jahr_Anmeldung = Y of timestamp_Anmeldung
jahr_Abmeldung = Y of timestamp_Abmeldung

// Restjahr ab Anmeldung
Tage[jahr_Anmeldung] = Tage (timestamp_31.12.{jahr_Anmeldung} - timestamp_Anmeldung)

// volle Jahre
for (i = jahr_Anmeldung+1 ; i < jahr_Abmeldung ; i++)
  Tage[i] = Tage_des_Jahres_i

// Jahresteil bis Abmeldung
Tage[jahr_Abmeldung] = Tage (timestamp_Abmeldung - timestamp_01.01.{jahr_Abmeldung})
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (14.01.2009 um 13:50 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:34  
Neuer Benutzer
 
Registriert seit: 14.01.2009
Beiträge: 14
web-producer befindet sich auf einem aufstrebenden Ast
Standard

Hm, das über die Jahreszahl zu lösen ist schon ein interessanter Lösungsansatz. Ich habe ihn gerade weiter verfolgt und bin gescheitert, wenn die Rechnungsperioden ungünstiger fallen als im meinem Beispiel, z. B:

März 2004 - Februar 2005
März 2005 - Februar 2006
März 2006 - Februar 2007

...oder habe ich was falsch verstanden?
web-producer ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:45  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Die Lösung deckt ja gerade mehrere Jahre ab. Als Tage () Funktion muß eine geeignete Datumsfunktion benutzt werden, die Schaltjahre etc. brücksichtigt.

für März 2004 - Februar 2005:

Code:
jahr_Anmeldung = 2004
jahr_Abmeldung = 2005
Tage[2004] = Tage (31.12.2004 - 01.03.2004)

for (i = 2005 ; i < 2005 ; i++) // also kein Schleifendurchlauf
  Tage[i] = Tage_des_Jahres_i
  
Tage[2005] = Tage (01.02.2005 - 01.01.2005)
Dazu mußt Du die Preise pro Tag abhängig vom Jahr abbilden:
Preis[2005] = x cent;

Später durchläufst Du Tage via foreach und multiplizierst mit den Preisen.

Code:
gesamt = 0
foreach (Tage as jahr => anzahl)
  gesamt += anzahl * Preis[jahr]
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (14.01.2009 um 13:51 Uhr).
nikosch ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:52  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

also ich würde das Ganze einfach über eine sql db lösen. (MySQL hat schöne Funktionen)

Du hast eine tabelle in der die abrechnungsperioden zum objekt abgelegt sind.
jetzt selektierst Du
a die abrechnungsperiode in der der anfang der leerzeit liegt
b die abrechnungsperiode in der das ende der leerzeit liegt
c die perioden die komplett zwischen anfang und ende der leerzeit liegen

monate in a)
wenn anfang am 15. dann
PERIOD_DIFF(max(periodenende,leerzeitende),anfang leerzeit) - 1/2
sonst anfang am 01.
PERIOD_DIFF(max(periodenende,leerzeitende),anfang leerzeit)

monate in b)
alle perioden vollständig

monate in c)
wenn ende 15 dann
PERIOD_DIFF(min(periodenanfang,leerzeitanfang),end e leerzeit) - 1/2
sonst ende zum 01.
PERIOD_DIFF(min(periodenanfang,leerzeitanfang),end e leerzeit) - 1
HPR1974 ist offline   Mit Zitat antworten
Alt 14.01.2009, 13:54  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Also Rechnungen mit 1/2 bei Monaten mit ungeraden Tagesanzahlen finde ich doch eher fragwürdig.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 14.01.2009, 14:11  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Das ist nicht die bestmögliche Lösung, aber sie ist einfach und verständlich (finde ich jedenfalls ) :
Erstmal findest Du heraus, ob keine Überschneidung vorliegt. periode.start > leerstand.end || periode.end > leerstand.start
Wenn das true ergibt, interessiert Dich diese Periode nicht.
Andernfalls nimmst Du max(periode.start, leerstand.start) und ziehst es von min(periode.end, leerstand.end) ab.

...ich hoffe, nichts übersehen zu haben
David ist offline   Mit Zitat antworten
Alt 14.01.2009, 14:12  
Erfahrener Benutzer
 
Registriert seit: 28.03.2008
Beiträge: 1.847
HPR1974 wird schon bald berühmt werden
Standard

IMHO sind viele kaufmännische regeln mathematisch nicht korrekt ist aber eine spezifikationssache.
die halben monate auf tagesbasis abzurechnen ist sicher genauer und transparent für jeden Kunden, dazu muss halt der tagessatz ermittelt werden.
Da kommt die nächste kaufmännische Frage um die Ecke: wird das über den jeweiligen monatssatz/30 oder über summe der monatssätze / anzahl tage im jahr errechnet?
HPR1974 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Auflösung erkennen? haufe PHP Tipps 2009 3 12.01.2009 18:17
Parameter erkennen. d.brenda PHP Tipps 2008 1 20.02.2008 12:43
User erkennen (ohne session + ohne cookies + prob mit IP) PHP Tipps 2007 8 30.12.2007 23:35
Mit PHP FTP Ordner erkennen mokus PHP Tipps 2007 14 09.07.2007 22:22
Könnt ihr einen Fehler erkennen?! NetLook PHP Tipps 2006 6 20.10.2006 10:52
PHP-erstelltes Bild erkennen Freeaak PHP Tipps 2006 26 30.09.2006 21:13
PHP in Textvariable erkennen? BartTheDevil89 PHP Tipps 2006 15 15.09.2006 14:42
Zurück-Klick erkennen PHP Tipps 2006 10 03.05.2006 17:53
Auflösung mittels PHP erkennen und .... PHP Tipps 2005 31 08.12.2005 10:50
[Erledigt] Browser erkennen PHP Tipps 2005 1 04.03.2005 20:29
interlaced erkennen PHP-Fortgeschrittene 7 10.02.2005 09:57
web oder wap erkennen Soese PHP Tipps 2005 6 19.01.2005 10:49
Bei Abfrage leeres Feld erkennen und reagieren? Datenbanken 6 13.12.2004 15:21
Browser Schließung erkennen themonk PHP Tipps 2004-2 17 01.12.2004 14:47
https erkennen PHP Tipps 2004 2 05.09.2004 16:07

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
sql zeitraum überschneidung, mysql zeitraum überschneidung, java zeitraum überschneidung, zeitraum überschneidung, php zeitraum überschneidung, zeitüberschneidung sql, sql zeitüberschneidung, mysql zeitüberschneidung, sql terminüberschneidung, zeitliche überschneidung berechnen, überschneidung zeiträume, sql überschneidende zeiträume, zeitliche überschneidung, php überschneidung, sql datum überschneidung, überschneidung zeitraum php, mysql zeit überschneidung, zeitüberschneidung mysql, sql zeitliche überschneidung, datum überschneidung prüfen

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum