[PHP] tijd (van tot) verdelen over periodes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beetje lastig om een goede titel te bedenken, ik verander 'm graag als iemand een betere heeft. Maar nu de vraag:

Uitgaande van het volgende: in de database staat een afspraak met een begintijd in UNIXTIME en een eindtijd in UNIXTIME. Ik kan in mijn systeem 3 tijdsvakken aangeven
(bv. A: 08:00 tot 12:00, B: 14:00 tot 17:00 en C: 20:00 tot 22:00).

Nu wil ik van een bepaalde afspraak achterhalen hoeveel tijd er in welk tijdsvak voorkomt en ook hoeveel tijd er totaal daarbuiten valt.
Ik heb lopen pruten met BETWEEN in SQL maar dat gaat me niet lukken, ook heb ik een hele serie if else statements geprobeerd, maar daarmee kom ik er ook niet, heeft iemand een tip of een functie in PHP die ik nog niet ken waarmee het makkelijker kan?

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
je input is dus een bepaalde afspraak (id) en een bepaald tijdsvlak (2 integers?)

zo uit me hoofd (quick and dirty):
PHP:
1
2
3
4
5
$row = mysql_fetch_object(mysql_query("SELECT * FROM `tabel` WHERE `afspraak_id` = '$aid';"));
$starttijd = $row->starttijd > $tijdvlakstarttijd ? $row->starttijd : $tijdvlakstarttijd;
$stoptijd = $row->stoptijd < $tijdvlakstoptijd ? $row->stoptijd : $tijdvlakstoptijd;
$afspraakbinnentijd =  $stoptijd - $starttijd;
$afspraakbuitentijd = $row->stoptijd - $row->starttijd - $afspraakbinnentijd;


wil je het direct van alle periodes kan je het netter doen, bijv. dmv een functie die het rekenwerk doet, en waar je 3x aan vraagt hoe/wat

[ Voor 11% gewijzigd door BasieP op 12-02-2007 16:14 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
kun je me zeggen hoe die ? en : functie heten, dan zoek ik er meer info over, is lastig zoeken binnen google die tekens...
bedankt voor de info ik ga t proberen

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat zijn ternary operators, een beknopte versie van if else. :)
conditie ? doen_als_true : doen_als_false

{signature}


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
code:
1
$c= $a > $b ? $a : $b

in het geval dat $a groter is dan $b dan wordt $c $a, en anders $b

had ook de functies max() en min() kunnen gebruiken in dit geval (was eigenlijk netter geweest)

dan zou het zoiets zijn:
PHP:
1
2
3
4
<?php
$starttijd = max($row->starttijd, $tijdvlakstarttijd);
$stoptijd = min($row->stoptijd, $tijdvlakstoptijd);
?>

[ Voor 56% gewijzigd door BasieP op 12-02-2007 16:34 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dit is toch niet helemaal de oplossing geloof ik, ik zal het voorbeeld wat uitgebreider vertellen
ik heb een afspraak van 13-02-2007 11:00:00 (1171364400) tot 13-02-2007 18:00:00 (1171389600)
dus 7 uur duurt deze afspraak. Daarnaast heb ik 3 tijdsvakken ingesteld:
A 10:00-12:00 // B 14:00-16:00 en C 19:00-21:00

Nu wil ik als uitkomst dat er
- in tijdsvak A: 1 uur van de afspraak valt (van 11 tot 12)
- in tijdsvak B: 2 uur van de afspraak valt (van 14 tot 16) en
- in tijdsvak C: 0 uur van de afspraak valt en
- dat er 4 uur over blijft buiten de tijdsvakken

Acties:
  • 0 Henk 'm!

  • _BladE2k_
  • Registratie: Juni 2001
  • Laatst online: 04-09 14:23
Verwijderd schreef op dinsdag 13 februari 2007 @ 09:49:
dit is toch niet helemaal de oplossing geloof ik, ik zal het voorbeeld wat uitgebreider vertellen
ik heb een afspraak van 13-02-2007 11:00:00 (1171364400) tot 13-02-2007 18:00:00 (1171389600)
dus 7 uur duurt deze afspraak. Daarnaast heb ik 3 tijdsvakken ingesteld:
A 10:00-12:00 // B 14:00-16:00 en C 19:00-21:00

Nu wil ik als uitkomst dat er
- in tijdsvak A: 1 uur van de afspraak valt (van 11 tot 12)
- in tijdsvak B: 2 uur van de afspraak valt (van 14 tot 16) en
- in tijdsvak C: 0 uur van de afspraak valt en
- dat er 4 uur over blijft buiten de tijdsvakken
Ik zou dan het volgende proberen:

- defineer tijdvak A B en C van die dag (mktime)
- check of begintijd in een bepaalde vak valt
- check of eindtijd in bepaalde vak valt
- is vak(begin) gelijk aan vak(eind) dan bereken hoeveel tijd er in tijdvak overblijft
- is vak(begin) niet gelijk aan vak(eind):
bereken vak(begin) tot aan tijdvak(x, eind); tijd over in vak(x) = totaal tijdvak(x) - berekening
bereken vak(eind) vanaf tijdvak(y, begin); bereken tijd over in vak(y)

Da's dan 'ff' in woorden, maar er is vast wel iemand die het in code goed kan vertalen. Ik verwacht echter dat er vast wel een makkelijkere manier is trouwens.. denk ik..

Een standaard GoTter ;)


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat is idd wat ik zo ongeveer heb gemaakt, en het lijkt wel te werken, maar het is nogal veel en omslachtig script, lijkt me dat het ook makkelijker moet kunnen

Acties:
  • 0 Henk 'm!

  • Jigs
  • Registratie: April 2004
  • Laatst online: 17-01-2024
Misschien moet je dan het omslachtige script eens posten. Dan kunnen we kijken hoe het simpeler kan.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
$sql_tarieven = "SELECT * FROM tijden";
$resulttar = mysql_query($sql_tarieven) or die (mysql_error());
$weergave_tar = mysql_fetch_object ($resulttar);
$ZtarA = $weergave_tar->ZtarA ;
$ZtarB = $weergave_tar->ZtarB ;
$ZtarC = $weergave_tar->ZtarC ;
$ZtarD = $weergave_tar->ZtarD ;
$ZtarE = $weergave_tar->ZtarE ;
$Avan = substr($ZtarA,0,2).substr($ZtarA,2,2); 
$Atot = substr($ZtarA,4,2).substr($ZtarA,6,2); 
$Avanpunt = substr($ZtarA,0,2).":".substr($ZtarA,2,2); 
$Atotpunt = substr($ZtarA,4,2).":".substr($ZtarA,6,2); 
$Apro = substr($ZtarA,8,3);
$Bvan = substr($ZtarB,0,2).substr($ZtarB,2,2); 
$Btot = substr($ZtarB,4,2).substr($ZtarB,6,2); 
$Bvanpunt = substr($ZtarB,0,2).":".substr($ZtarB,2,2); 
$Btotpunt = substr($ZtarB,4,2).":".substr($ZtarB,6,2); 
$Bpro = substr($ZtarB,8,3);
$Cvan = substr($ZtarC,0,2).substr($ZtarC,2,2); 
$Ctot = substr($ZtarC,4,2).substr($ZtarC,6,2); 
$Cvanpunt = substr($ZtarC,0,2).":".substr($ZtarC,2,2); 
$Ctotpunt = substr($ZtarC,4,2).":".substr($ZtarC,6,2); 
$Cpro = substr($ZtarC,8,3);
$Dvan = "zaterdag";
$Dtot = "zaterdag";
$Dpro = $ZtarD;
$Evan = "zondag";
$Etot = "zondag";
$Epro = $ZtarE;
//D en E zit alleen een procent
//in A B C zit bv 01001200160 als van 0100 uur tot 1200 uur 160 % geldt
    
    $sql_query = "SELECT * FROM medewerkers ORDER BY achternaam";
    $resultgo = mysql_query($sql_query) or die (mysql_error());
    while ($weergave = mysql_fetch_object ($resultgo)) //while 1
    {  
        $gewerkt = "0";
        $A = 0;
        $B = 0;
        $C = 0;
        $D = 0;
        $E = 0;
        $F = 0;
        $medewerker = $weergave->id;
        $medewerker naam = $weergave->achternaam;
        $sql_query2 = "SELECT * FROM afspraken WHERE mid = $medewerker AND startdatum LIKE '%$maand%$jaar%'";
        $result2 = mysql_query($sql_query2) or die (mysql_error());
        while ($get = mysql_fetch_object ($result2)) //while 2
        {
            $starttijdunix = strtotime("$get->startdatum $get->tijd");
            $einddtijdunix = strtotime("$get->einddatum $get->eindtijd");
            $dag = date("D",strtotime($get->startdatum));
            if ($dag == "Sat")
                {
                $D += $einddtijdunix-$starttijdunix;
                }
            elseif ($dag == "Sun")
                {
                $E += $einddtijdunix-$starttijdunix;
                }           
            elseif  (date("Hi",$starttijdunix)>=$Avan && date("Hi",$einddtijdunix)<=$Atot)
                {
                $A += $einddtijdunix-$starttijdunix;
                }   
            elseif  (date("Hi",$starttijdunix)>=$Bvan && date("Hi",$einddtijdunix)<=$Btot)
                {
                $B += $einddtijdunix-$starttijdunix;
                }   
            elseif  (date("Hi",$starttijdunix)>=$Cvan && date("Hi",$einddtijdunix)<=$Ctot)
                {
                $C += $einddtijdunix-$starttijdunix;
                } 
            else
            {
            $tempvan = strtotime("$get->startdatum 00:00");
            $tempAvan = strtotime("$get->startdatum $Avanpunt");
            $tempAtot = strtotime("$get->startdatum $Atotpunt");
            $tempBvan = strtotime("$get->startdatum $Bvanpunt");
            $tempBtot = strtotime("$get->startdatum $Btotpunt");
            $tempCvan = strtotime("$get->startdatum $Cvanpunt");
            $tempCtot = strtotime("$get->startdatum $Ctotpunt");
            $temptot = strtotime("$get->startdatum 00:00")+86400;
            ////// afspraken die over een hele tariefperiode heen vallen
            if ($starttijdunix<=$tempAvan && $einddtijdunix >= $tempAtot)                    {
                $A += $tempAtot-$tempAvan;                          }
            if ($starttijdunix<=$tempBvan && $einddtijdunix >= $tempBtot)                   {
                $B += $tempBtot-$tempBvan;                           }
            if ($starttijdunix<=$tempCvan && $einddtijdunix >= $tempCtot)                   {
                $C += $tempCtot-$tempCvan;                           }
            ////// afspraken die over het eerste deel van een tariefperiode heen vallen 
            if ($starttijdunix<=$tempAvan && ($einddtijdunix >= $tempAvan && $einddtijdunix <= $tempAtot))              
                {
                $A += $einddtijdunix-$tempAvan;                         }   
            if ($starttijdunix<=$tempBvan && ($einddtijdunix >= $tempBvan && $einddtijdunix <= $tempBtot))              
                {
                $B += $einddtijdunix-$tempBvan;                         }
            if ($starttijdunix<=$tempCvan && ($einddtijdunix >= $tempCvan && $einddtijdunix <= $tempCtot))              
                {
                $C += $einddtijdunix-$tempCvan;                         }
            ////// afspraken die over het laatste deel van een tariefperiode heen vallen    
            if ($einddtijdunix>=$tempAtot && ($starttijdunix >= $tempAvan && $starttijdunix <= $tempAtot))              
                {
                $A += $tempAtot-$starttijdunix;                         }   
            if ($einddtijdunix>=$tempBtot && ($starttijdunix >= $tempBvan && $starttijdunix <= $tempBtot))              
                {
                $B += $tempBtot-$starttijdunix;                         }
            if ($einddtijdunix>=$tempCtot && ($starttijdunix >= $tempCvan && $starttijdunix <= $tempCtot))              
                {
                $C += $tempCtot-$starttijdunix;                         }                                                                           
            } //else
            
            $duur = tijdnaargetal($get->aantal_uur);
            $duur = $duur*3600; //duur in seconden
            $gewerkt += $duur;
        }   //while 2
        $F = $gewerkt-($A+$B+$C+$D+$E); //totaal - tijden uit tijdsblokken = rest
Pagina: 1