Toon posts:

[MySQL/PHP] Maanden vergelijken en koppelen aan database*

Pagina: 1
Acties:
  • 104 views sinds 30-01-2008

Verwijderd

Topicstarter
Hallo,

Ik zit met het volgende. Voor het afschrijven van machines wil ik een scriptje maken om zo het afschrijvingspercentage op een bepaalde datum te weten te komen. Ik weet alleen niet goed hoe ik het aantal maanden vergelijk en deze vervolgens koppel aan een database.

Dus ik voer de datum in wanneer de machine is gekocht en vergelijk deze met de huidige datum. Dan moet uitgerekend worden hoeveel maanden verstreken zijn. Dit aantal wil ik dan vergelijken met de gegevens uit de database. Die er als volgt uitzien:

Minder dan een maand: 0,96
Een maand of meer maar wel minder dan twee maanden: 0,93

Etc, dit gaat zo verder en de marge veranderd op een gegeven moment naar 6 maanden en dan naar het aantal jaren. Het percentage moet opgeslagen worden in een variabele. Ik weet niet goed hoe de vergelijking op te stellen en deze vervolgens nog eens te vergelijken met de database.

Grt, Pski.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Een formule maken ga ik niet voor je doen, dat zou je zelf moeten kunnen. Wat betreft die vergelijking in je database...dat hangt er een beetje vanaf waar je mee werkt. MySQL heeft bijvoorbeeld DATE_ADD en DATE_SUB en dergelijke, daar moet je wel een eind mee kunnen komen.

Dus: waar werk je mee? Sowieso hoort dat in je topictitel te staan.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Als ik het zou weten had ik ook geen vraag gesteld. Vandaar dat ik daar in het topictitel niets van heb ingezet. Het gaat mij ook niet om de complete code, daar vraag ik ook niet naar. Het gaat me alleen om dingen die me op pad helpen of die het probleem kunnen overbruggen.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Dan nog moeten weten met welke omgeving je werkt... MySQL? MSSQL? Oracle?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Met MySQL en roep het aan met php.

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 28-04 22:08

ripexx

bibs

De belangrijkste variabele die je wil weten is hoeveel maanden er tussen datum en aankoop datum zit. Dit kan MySQL of PHP voor je uitrekenen. Zowel MySQL als PHP beschikken over verschillende datum functies die je hiervoor zou kunnen gebruiken. Wat je je eigenlijk zou moeten afvragen is,hoort het bereken van deze periode in de database thuis of is dit een businessrule. Want de opslag/factor is afhankelijk van de periode. Stel dat je nu gaat switchen naar weken of dagen wat doe je dan. Het ontwerp hangt hier veel vanaf.

Voordeel van het gebruik van MySQL is dat er native datediff functie szijn, en dat je voor PHP zelf zo'n functie zou moeten schrijven. (hint: http://www.php.net/date usercomments!)

Voordeel van zo'n functie dat je diretc de inteval kan opgeven als mede de twee datums. Door de juiste datum uit de database te halen kan je deze direct aanleveren aan de functie.

Zo nu genoeg info waarmee je verder aan de slag kan ;)

buit is binnen sukkel


Verwijderd

Topicstarter
Even voor de duidelijkheid. Ik haal geen datum uit de database.
Ik voer zelf de datum van aankoop in in een textfield en de datum van vandaag slaat ie gewoon op in z'n geheugen. Bij het eerste gedeelte is dus nog geen sprake van een database!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Verwijderd schreef op dinsdag 16 augustus 2005 @ 22:53:
Even voor de duidelijkheid. Ik haal geen datum uit de database.
Ik voer zelf de datum van aankoop in in een textfield en de datum van vandaag slaat ie gewoon op in z'n geheugen. Bij het eerste gedeelte is dus nog geen sprake van een database!
Voor het invoeren van data heb je dat verschil toch ook niet nodig? Ik neem aan dat je dingen in wil kunnen voeren en die dan in de database zetten...daarna kun je het toch ophalen en te werk gaan zoals ripexx zegt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Vesta
  • Registratie: November 2004
  • Niet online
Ik denk dat bovenstaande mensen je verkeerd begrijpen.. Als ik het goed snap, wil je dus voor een bepaalde "leeftijd" het afschrijvingspercentage weten? dus

0-1 maand = 96%
1-2 maanden = 93%
2-3 maanden = 90%
..
6-12 maanden = 80% (6 maanden)
..
24-36 maanden = 60% (jaar)

En de leeftijd bepaal je al met php adhv het textfield en de huidige datum? Dan maak je toch een tabel met 3 kolommen: minimum leeftijd, maximum leeftijd, percentage? En dan een
SQL:
1
SELECT percentage FROM afschrijving WHERE leeftijd BETWEEN minumum AND maximum

Verwijderd

Topicstarter
Juist zoiets bedoel ik. Ik heb nu een script genomen uit http://www.php.net/date. Maar hij geeft steeds een te groot aantal dagen weer (ik probeer het eerst met dagen te kijken of het werkt en kijk dan hoe ik het verander naar maanden).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
function age($BirthDate, $do)
{

if ($do == "") { $do = "1"; } //Checks if do is set, default set is number of days

list($day1,$month1,$year1) = split('[-.]', $BirthDate); //Splits date apart

$year = date("Y"); //Gets Current Year
$month = date("m"); //Gets Current Month
$day = date("d"); //Gets Current Day

$date = mktime(0,0,0,$day,$month,$year); //Gets Unix timestamp for current date
$date1 = mktime(0,0,0,$day1,$month1,$year1); //Gets Unix timestamp for date set

$difference = $date-$date1; //Calcuates Difference
$days2 = floor($difference /60/60/24); //Calculates Days Old

//If you choice "2" which is status unstead of days you can modify it here!
if ($days2 <= "20") { $days1 = "2 Weeks"; }
if ($days2 <= "13") { $days1 = "1 Week"; }
if ($days2 <= "7") { $days1 = "New"; }
if ($days2 >= "21") { $days1 = "Old"; }
//End Status Modify

if ($do == "1") { echo $days1; } //Echo Status
if ($do == "2") { echo $days2; } //Echo Days
}
age('02-08-2005', '2')
?>


Hij geeft hierbij 423 dagen weer, dus daar klopt geen snars van.

  • Vesta
  • Registratie: November 2004
  • Niet online
Zo op het eerste gezicht is de volgorde van mktime verkeerd:
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )
dus maanden, dagen, jaren ipv dagen, maanden, jaren

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 28-04 22:08

ripexx

bibs

Verwijderd schreef op woensdag 17 augustus 2005 @ 00:04:
Juist zoiets bedoel ik. Ik heb nu een script genomen uit http://www.php.net/date. Maar hij geeft steeds een te groot aantal dagen weer (ik probeer het eerst met dagen te kijken of het werkt en kijk dan hoe ik het verander naar maanden).

PHP:
1
...

Hij geeft hierbij 423 dagen weer, dus daar klopt geen snars van.
De usercommnets op php.net zal je op waarde moeten schatten.Er zijn in ierde rgeval een aantal redelijk goede datediff functies geschreven.

Los van het verhaal waar de datums vandaan haalt ;) Maar dan snap ik niet hoe jij weer bij MySQL terecht komt. Immers vergelijk je ingevoerde datum met huidige datum. Er komt helemaal geen database aan te pas.
Vesta schreef op woensdag 17 augustus 2005 @ 00:08:
Zo op het eerste gezicht is de volgorde van mktime verkeerd:
[...]
dus maanden, dagen, jaren ipv dagen, maanden, jaren
http://www.php.net/mktime dus niet he ;)
Description:
int mktime ( [int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]] )

[ Voor 22% gewijzigd door ripexx op 17-08-2005 09:27 ]

buit is binnen sukkel


Verwijderd

Topicstarter
Ik heb het volgende en dat werkt, er zit alleen een onnauwkeurigheid in

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function monthdiff($datefrom, $dateto, $using_timestamps = false) {
    if (!$using_timestamps) {
        $datefrom = strtotime($datefrom, 0);
        $dateto = strtotime($dateto, 0);
    }
  
    $difference = $dateto - $datefrom; // Difference in seconds
   
    $months_difference = floor($difference / 2678400);
    while (mktime(date('H', $datefrom), date('i', $datefrom), date('s', $datefrom), date('n', $datefrom)+($months_difference), date('j', $dateto), date('Y', $datefrom)) < $dateto) {
        $months_difference++;
    }
    $months_difference--;
    return $months_difference;
}

$datum = $_POST['datum'];
echo monthdiff($datum, '29 February 2004', false);


ik heb hier als datum 29 February 2004 genomen, de laatste dag van die maand. Als ik dan in het invoerveld 31 January 2004 invul, gaat het fout en geeft hij o maanden weer! Dit moet er dus 1 zijn! Hij rekent dus blijkbaar het aantal dagen, maar ik moet de aantal verstreken maanden weten en die zijn dus niet altijd 30 of 31.

  • ripexx
  • Registratie: Juli 2002
  • Laatst online: 28-04 22:08

ripexx

bibs

Verwijderd schreef op woensdag 17 augustus 2005 @ 09:28:
[..]
ik heb hier als datum 29 February 2004 genomen, de laatste dag van die maand. Als ik dan in het invoerveld 31 January 2004 invul, gaat het fout en geeft hij o maanden weer! Dit moet er dus 1 zijn! Hij rekent dus blijkbaar het aantal dagen, maar ik moet de aantal verstreken maanden weten en die zijn dus niet altijd 30 of 31.
En nu verwacht je dat wij een nieuwe functie voor je gaan schrijven die het probleem oplost :? Als je nu rustig door de code loopt en gaat kijken waarom het in dit geval mis gaat. Succes :)

buit is binnen sukkel


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
zowiezo bedenkt eerst eens wat je precies wilt. Wil je ook dat er een maand voorbij is als je van 31 Januari tot 2 Februari doet ( Je zit tenslotte in een nieuwe maand ). Want zoals ik het in je voorbeeld zie is er in mijn optiek idd geen maand verstreken.

wat ik zou doen als ik jou was is ( EindMaandNr - StartMaandNr + ( (EindJaar - StartJaar) * 12 ) ) en als je wilt dat er een complete maand verstreken moet zijn om hem mee te tellen kan je er nog een vanaf halen als de EindDag kleiner is als de StartDag.

Als jij een andere definitie hebt voor wanneer er een maand verstreken is moet je die eerst eens duidelijk defineren. Als je dat gedaan hebt is het ook niet moeilijk om het te programmeren.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Het gaat mis bij het gedeelte van secondes, 2678400 is 31 dagen.

PHP:
1
2
3
4
    $months_difference = floor($difference / 2678400);
    while (mktime(date('H', $datefrom), date('i', $datefrom), date('s', $datefrom), date('n', $datefrom)+($months_difference), date('j', $dateto), date('Y', $datefrom)) < $dateto) {
        $months_difference++;
    }


wat ie daarna doet snap ik niet. Wat is ++? telt ie er dan 2 bij op?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als ik je goed begrijp heb je de verschillende percentages in een tabel zitten? Als die tabel er ongeveer zo uit ziet:

AantalMaanden, Factor
1 | 0,98
2 | 0,96
3 | 0,90

etc.

Kun je dan niet iets doen als

SQL:
1
2
3
SELECT Machines.Naam, TabelMetPercentages.Factor  
FROM Machines
LEFT OUTER JOIN TabelMetPercentages ON DATEDIFF(m,Machines.AankoopDatum,huidigeDatum) = TabelMetPercentages.AantalMaanden

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
Wat de maanden betreft het gaat bij afschrijven vaak om volle maanden dus dat is op deze manier:
  • 30 november 2003, - 29 december 2003, - minder dan maand
  • 30 november 2004, - 31 december 2004, - een maand
  • 31 januari 2004, - 29 februari 2004, - een maand
  • 31 december 2003, - 2 februari 2004, - 1 maand, meer dan 1 maand, maar minder dan 2 maanden

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:50

Creepy

Tactical Espionage Splatterer

Pski: wat ++ doet kan je prima zelf opzoeken in de PHP manual ;) (hij telt er gewoon 1 bij op. -- trekt er 1 vanaf)

Daarbij, wat is nu nog precies het probleem? Ik zie al een aantal oplossingen gegeven worden waarmee je wel uit de voeten moet kunnen toch?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Het probleem is dat schrikkeljaren over het hoofd worden gezien. Hij telt ook geen volle maanden.

voer ik in het invoerveld in:

2003-11-30 (30 november 2003) en zet ik in z'n geheugen 31 december 2003 en ik laat hem vergelijken, dan geeft ie de waarde 0, terwijl er een volle maand is verstreken en dus zou hij de waarde 1 moeten weergeven.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Definieer nou eerst eens een keer precies wat je met een volle maand bedoeld. Als je dat gedaan hebt kun je heel makkelijk de code erbij bedenken. Neem bijvoorbeeld

30 Januari 2004 - 28 Februari 2004 is dat een volle maand en nog belangrijker waarom wel of niet. Als je dat duidelijk weet te vertellen heb je de regels waaraan het doet en kan je heel simpel een stukje code schrijven.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:50

Creepy

Tactical Espionage Splatterer

Pski: Je probleem is duidelijk. Maar wat wil je nu dat wij er aan doen? Met de code die je nu gebruikt moet het toch niet al te moeilijk zij om het aan te passen?
Dus wat heb je nu zelf al geprobeerd om tot een oplossing te komen? Er zijn al redelijk wat voorbeelden e.d. voorbij gekomen waarmee je een vrij duidelijk idee kunt vormen hoe nu je eigen probleem op te lossen. Kijk ook nog eens in de PHP documentatie bij de date functie naar de usercomments, ook daar staat een hoop bruikbare informatie tussen.

Een verschil tussen twee data berekening is niet zo moeilijk, dus als je precies kan definieren wat een "volle maand is" (zoals rwb al aangeeft) moet het een kleine moeite zijn om zoiets zelf in elkaar te zetten.

Het is hier natuurlijk niet de bedoeling dat wij je script voor je in elkaar aan het zetten zijn ;) Dat gevoel krijg ik nu wel omdat je niet post welke zaken je nu zelf al hebt geprobeerd om je eigen probleem op te lossen behalve het downloaden en gebruiken van een voorbeeld script van php.net.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik heb de datumvergelijking voor elkaar gekregen en de database gevuld met de minimum en maximum. De query van Vesta heb ik vervolgens gebruikt:


SELECT percentage FROM afschrijving WHERE leeftijd BETWEEN minumum AND maximum


Deze query gaat er alleen vanuit dat leeftijd uit de database wordt gehaald. Bij mij is dat niet zo en is leeftijd dus gewoon een variabele $leeftijd. Nu vroeg ik me af of je een variabele in een sql-query zou kunnen plaatsen om dit op te lossen?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Waarom niet? :?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Oké dan ;) .

Verwijderd

Topicstarter
Dit is het script zoals ik het nu heb,

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
include("connect.php");
function monthdiff($datefrom, $dateto, $using_timestamps = false) {
    if (!$using_timestamps) {
        $datefrom = strtotime($datefrom, 0);
        $dateto = strtotime($dateto, 0);
    }
  
    $difference = $dateto - $datefrom; // Difference in seconds
   
    $months_difference = floor($difference / 2678400);
    return $months_difference;
}
$todate = date("y-m-d");
$datum = $_POST["jaar"] . "-" . $_POST["maand"] . "-" . $_POST["dag"];
monthdiff($datum, $todate, false);

$query="SELECT percentage FROM afschrijving WHERE $months_difference BETWEEN minimum AND maximum";
$result = mysql_query($query) or die ("FOUT: " . mysql_error());
echo $result;
?>


Ik wil het resultaat van $result op het scherm te zien krijgen, maar dat lukt niet. Roep ik de functie monthdiff nu niet aan of kan $result = mysql_query... etc niet.

[ Voor 9% gewijzigd door Verwijderd op 25-08-2005 21:34 ]


  • Vesta
  • Registratie: November 2004
  • Niet online
Zie de functions manual en met name return, dit is toch wel basiskennis. Het komt er op neer dat je de functie wel aanroept, maar niets met het resultaat doet. De variabele $months_difference zit in de scope van de functie monthdiff en die kun je niet daarbuiten aanroepen.

Daarnaast geeft mysql_query een resource terug (mits de query correct is). Zie weer de documentatie hoe je het resultaat vervolgens op je scherm kunt krijgen.

Ik denk dat je met deze links wel verder moet kunnen komen, gewoon de documentatie goed lezen. Tip: echo je $query voordat je hem uitvoert, dan weet je of de query wel klopt.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:50

Creepy

Tactical Espionage Splatterer

Riiight. Je wilt dus het resultaat van de query op je scherm? Pak een willekeurige PHP/MySQL tutorial er eens bij en dan staat dat daar keurig in uitgelegd.

Het spijt me maar je gaat me echt niet wijsmaken dat je zelf al hebt geprobeerd om dit op te lossen. Elke PHP/MySQL tutorial verteld je hoe je je resultaten op het scherm kan krijgen. Dit is, zoals Vesta ook al aangeeft, toch redelijke basis kennis.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.