Rekenen met tijden
Ik heb een script wat rekent met tijden.
Dus er staan een tal van tijden in de database bv: 2:30, 4:45, 8:15, 3:45
Die worden dan opgeteld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
$time = date("H.i", strtotime($prodrow['totaal']));
$time = ((int)$time) * 60 + ($time - ((int)$time)) * 100;
if ($timetotal == null)
{
$timetotal = date("H.i", strtotime("00:00"));
}
$timetotal += $time;
$hours = date("i", $timetotal);
$minutes = date("s", $timetotal);
$time = ((int)$time) * 60 + ($time - ((int)$time)) * 100;
if ($timetotal == null)
{
$timetotal = date("H.i", strtotime("00:00"));
}
$timetotal += $time;
$hours = date("i", $timetotal);
$minutes = date("s", $timetotal);
en komt er een totaal op het scherm. Echter na 60 uur gewerkt te hebben begint hij weer op 0...
zie de volgende echo die ik naar het scherm schrijf:
04:00
10:30
14:15
22:00
24:45
32:30
36:15
44:45
49:15
53:45
03:30
Hij moet doortellen en op een totaal van 63:30 komen hoe doe ik dit ?
Gewijzigd op 10/04/2012 11:31:55 door Trinco ingels
Geef de juiste relevante code.
Code (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
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
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
<?php
if(isset($_POST['submit2']))
{
}
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$date1 = date('Y-m-d', strtotime($_POST['datumvan']));
$date2 = date('Y-m-d', strtotime($_POST['datumtot']));
$prodcatsql = "SELECT * FROM uren WHERE datum BETWEEN '".$date1."' AND '".$date2."' AND ingevuld_door = '".$_SESSION['sid']."'ORDER BY datum";
}
elseif(!isset($_GET['actie']) == 'verzenden')
{
$prodcatsql = "SELECT * FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."' ORDER BY datum ";
}
$prodcatres = mysql_query($prodcatsql);
$numrows = mysql_num_rows($prodcatres);
$id = "";
if (!$numrows == 0)
{
while ($prodrow = mysql_fetch_array($prodcatres))
{
$vakken_array[] = $prodrow['id'];
$id = $prodrow['id'];
$date = date("d-m-Y", strtotime($prodrow['datum']));
$begin = date("H:i", strtotime($prodrow['begin']));
$eind = date("H:i", strtotime($prodrow['eind']));
$totaal = date("H:i", strtotime($prodrow['totaal']));
$ingevuld_op = $prodrow['ingevuld_op'];
$dagen = array("Maandag" => "Monday", "Dinsdag" => "Tuesday", "Woensdag" =>
"Wednesday", "Donderdag" => "Thursday", "Vrijdag" => "Friday", "Zaterdag" =>
"Saturday", "Zondag" => "Sunday");
$dt = strtotime($prodrow['datum']);
$dt = date("l", $dt);
while ($day = current($dagen))
{
if ($day == $dt)
{
$day1 = key($dagen) . '<br />';
}
next($dagen);
}
$time = date("H.i", strtotime($prodrow['totaal']));
$time = ((int)$time) * 60 + ($time - ((int)$time)) * 100;
if ($timetotal == null)
{
$timetotal = date("H.i", strtotime("00:00"));
}
$timetotal += $time;
$hours = date("i", $timetotal);
$minutes = date("s", $timetotal);
$dayhour = date("g", strtotime($prodrow['totaal']));
$daymin = date("i", strtotime($prodrow['totaal']));
echo $hours . ':'.$minutes. '<br>';
echo "<tr>";
echo "<td><input type=\"checkbox\" class=\"checkbox\" name=\"id[]\" value=".$id." /></td>";
echo "<td>". $day1 ."</td>";
echo "<td>". $date;
echo "<td>" . $begin . " - " . $eind . "</td>";
echo "<td>" . $totaal. "</td>";
echo "<td>" . ucfirst($prodrow['werkgever']). "</td>";
echo "<td>" . ucfirst($prodrow['werkzaamheid']). "</td>";
?>
<td>
<a href="edituur.php?edit&id=<?=$id?>"><img src="images/ico_edit_16.png" class="icon16 fl-space2" alt="" title="wijzigen" /></a>
<a href="delete.php?delete&id=<?=$id?>" onClick="if(confirm('Weet je het zeker?'))this.href='delete.php?delete&id=<?=$id?>'; else this.href=''"><img src="images/ico_delete_16.png" class="icon16 fl-space2" alt="" title="verwijderen" /></a>
</td>
<?
echo "</td>";
echo "</tr>";
}
echo "<tfoot><tr>";
echo "<th style=\"text-align:right\" colspan=\"4\">Totaal:</b></th>
<th><i>" . $hours . ":" . $minutes ."</i></th>
<th></th>
<th></th>
<th></th>";
echo "</tr></td></tr></tfoot>";
}
?>
if(isset($_POST['submit2']))
{
}
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$date1 = date('Y-m-d', strtotime($_POST['datumvan']));
$date2 = date('Y-m-d', strtotime($_POST['datumtot']));
$prodcatsql = "SELECT * FROM uren WHERE datum BETWEEN '".$date1."' AND '".$date2."' AND ingevuld_door = '".$_SESSION['sid']."'ORDER BY datum";
}
elseif(!isset($_GET['actie']) == 'verzenden')
{
$prodcatsql = "SELECT * FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."' ORDER BY datum ";
}
$prodcatres = mysql_query($prodcatsql);
$numrows = mysql_num_rows($prodcatres);
$id = "";
if (!$numrows == 0)
{
while ($prodrow = mysql_fetch_array($prodcatres))
{
$vakken_array[] = $prodrow['id'];
$id = $prodrow['id'];
$date = date("d-m-Y", strtotime($prodrow['datum']));
$begin = date("H:i", strtotime($prodrow['begin']));
$eind = date("H:i", strtotime($prodrow['eind']));
$totaal = date("H:i", strtotime($prodrow['totaal']));
$ingevuld_op = $prodrow['ingevuld_op'];
$dagen = array("Maandag" => "Monday", "Dinsdag" => "Tuesday", "Woensdag" =>
"Wednesday", "Donderdag" => "Thursday", "Vrijdag" => "Friday", "Zaterdag" =>
"Saturday", "Zondag" => "Sunday");
$dt = strtotime($prodrow['datum']);
$dt = date("l", $dt);
while ($day = current($dagen))
{
if ($day == $dt)
{
$day1 = key($dagen) . '<br />';
}
next($dagen);
}
$time = date("H.i", strtotime($prodrow['totaal']));
$time = ((int)$time) * 60 + ($time - ((int)$time)) * 100;
if ($timetotal == null)
{
$timetotal = date("H.i", strtotime("00:00"));
}
$timetotal += $time;
$hours = date("i", $timetotal);
$minutes = date("s", $timetotal);
$dayhour = date("g", strtotime($prodrow['totaal']));
$daymin = date("i", strtotime($prodrow['totaal']));
echo $hours . ':'.$minutes. '<br>';
echo "<tr>";
echo "<td><input type=\"checkbox\" class=\"checkbox\" name=\"id[]\" value=".$id." /></td>";
echo "<td>". $day1 ."</td>";
echo "<td>". $date;
echo "<td>" . $begin . " - " . $eind . "</td>";
echo "<td>" . $totaal. "</td>";
echo "<td>" . ucfirst($prodrow['werkgever']). "</td>";
echo "<td>" . ucfirst($prodrow['werkzaamheid']). "</td>";
?>
<td>
<a href="edituur.php?edit&id=<?=$id?>"><img src="images/ico_edit_16.png" class="icon16 fl-space2" alt="" title="wijzigen" /></a>
<a href="delete.php?delete&id=<?=$id?>" onClick="if(confirm('Weet je het zeker?'))this.href='delete.php?delete&id=<?=$id?>'; else this.href=''"><img src="images/ico_delete_16.png" class="icon16 fl-space2" alt="" title="verwijderen" /></a>
</td>
<?
echo "</td>";
echo "</tr>";
}
echo "<tfoot><tr>";
echo "<th style=\"text-align:right\" colspan=\"4\">Totaal:</b></th>
<th><i>" . $hours . ":" . $minutes ."</i></th>
<th></th>
<th></th>
<th></th>";
echo "</tr></td></tr></tfoot>";
}
?>
In een normale datum/tijd kan het aantal minuten nooit boven de 60 (of eigenlijk zelfs 59) uitkomen. Als je dus het totaal aantal minuten wilt laten zien zal je moeten afstappen van het gebruik van date functies en gewoon met integers gaan werken.
Erwin H op 10/04/2012 12:16:52:
Volgens mij zit het probleem gewoon hierin: $minutes = date("s", $timetotal);
In een normale datum/tijd kan het aantal minuten nooit boven de 60 (of eigenlijk zelfs 59) uitkomen. Als je dus het totaal aantal minuten wilt laten zien zal je moeten afstappen van het gebruik van date functies en gewoon met integers gaan werken.
In een normale datum/tijd kan het aantal minuten nooit boven de 60 (of eigenlijk zelfs 59) uitkomen. Als je dus het totaal aantal minuten wilt laten zien zal je moeten afstappen van het gebruik van date functies en gewoon met integers gaan werken.
Erwin het zit hem erin dat de minuten wel opgeteld worden.
dus zoals ik aangaf heb ik 53:45 en daar komt dan 9:45 bij dan zou je zeggen dit is 63:30 maar hij begint dan weer opnieuw en geeft 3:30 weer.
Het lijkt me niet dat dit aan de minuten ligt maar eerder aan de uren. Net of er een maximum aan zit...
http://nl.php.net/manual/en/function.date.php ::
i Minutes with leading zeros 00 to 59
Ik volg niet wat je hiermee berekent.
---
Misschien helpt het als je nog eens compact noteert wat je gegevens zijn, wat voor soort uitvoer je wil produceren, en daar dan een overzichtelijke route naartoe programmeert? Je maakt uitgebreid gebruik van date(), waarom eigenlijk?
Trinco ingels op 10/04/2012 12:42:07:
Het lijkt me niet dat dit aan de minuten ligt maar eerder aan de uren. Net of er een maximum aan zit...
Natuurlijk zit er een limiet aan. Heb je wel eens op de klok gekeken en daar 3:63:30 op zien staan (h:m:s)?
Quote:
Erwin het zit hem erin dat de minuten wel opgeteld worden.
dus zoals ik aangaf heb ik 53:45 en daar komt dan 9:45 bij dan zou je zeggen dit is 63:30 maar hij begint dan weer opnieuw en geeft 3:30 weer.
dus zoals ik aangaf heb ik 53:45 en daar komt dan 9:45 bij dan zou je zeggen dit is 63:30 maar hij begint dan weer opnieuw en geeft 3:30 weer.
Nee, wat hij geeft is 1:03:30, alleen omdat je de uren niet print zie je alleen de minuten en secondes.
Daarom, als je het totaal aantal minuten wilt weten, dan doe je er goed aan om met simpele integers te gaan werken en niet met datetime functies. Die zijn namelijk gelimiteerd tot de waardes die op de klok daadwerkelijk voor kunnen komen en 63 minuten zal je dus nooit als uitkomst krijgen.
Gewijzigd op 10/04/2012 13:12:17 door Erwin H
Wat ik wil is het volgende:
Ik voer allemaal gewerkte uren in, per dag heb je dan een een totaal aantal uur gewerkt bijvoorbeeld: 4:30 (4uur en 30 min).
Er komen dus meerdere regels in de database te staan.
Als ik ze opvraag moet het script de uren + minuten optellen. En dan het uiteindelijke totaal weergeven op het scherm.
Dat is wat ik verwacht.
Het script is niet helemaal zelf geschreven toen der tijd.. Ik heb me hierin wel wat verdiept maar nog niet goed genoeg.
Ik hoop dat ik je het wat makkelijker maak.
Gewijzigd op 10/04/2012 13:19:58 door Erwin H
Erwin H op 10/04/2012 13:18:51:
Staan de uren en minuten in aparte velden in de database? Zo ja dan is het redelijk eenvoudig op te lossen.
Gewijzigd op 10/04/2012 13:24:54 door trinco ingels
Wat ik bedoelde is of je een aparte kolom hebt voor uren en een aparte voor minuten (had ik misschien beter moeten verwoorden).
Dan is denk ik het makkelijkste om het met php op te lossen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$h = 0;
$m = 0;
//loop door alle resultaten heen en tel de uren bij elkaar op en de minuten
foreach( $row as $r ){
$times = explode( ':', $r['uren'] );
$h += $times[0];
$m += $times[1];
}
//nu nog het aantal minuten terugbrengen naar max 60 en het aantal uren ophogen
$h += floor($m / 60);
$m %= 60;
echo 'gewerkte uren: '.$h.':'.$m;
?>
$h = 0;
$m = 0;
//loop door alle resultaten heen en tel de uren bij elkaar op en de minuten
foreach( $row as $r ){
$times = explode( ':', $r['uren'] );
$h += $times[0];
$m += $times[1];
}
//nu nog het aantal minuten terugbrengen naar max 60 en het aantal uren ophogen
$h += floor($m / 60);
$m %= 60;
echo 'gewerkte uren: '.$h.':'.$m;
?>
Gewijzigd op 10/04/2012 14:25:46 door Erwin H
Zou ik niet de sum functie binnen mysql gebruiken ?
Gewijzigd op 10/04/2012 13:56:08 door trinco ingels
Je kan het altijd proberen, maar gezien de manier waarop het is opgeslagen geef ik je weinig kans van slagen.
Erwin H op 10/04/2012 14:25:32:
Je kan het altijd proberen, maar gezien de manier waarop het is opgeslagen geef ik je weinig kans van slagen.
Dus je zegt dat ik uur en minuten in een aparte kolom moet opslaan?
En dan met behulp van je script het totaal moet uitrekenen?
Opzich zou je toch ook deze tijden met elkaar moeten kunnen optellen...
Je kunt de uren misschien gewoon opslaan als decimal. Uren en minuten in twee velden kan ook, maar levert je wel wat werk steeds als je iets met een record wil doen. Daar staat dan tegenover dat 10 minuten niet als nette fractie in een decimal-veld gaat...
Code (php)
1
2
3
2
3
$result = mysql_query("SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(DATE_FORMAT(totaal, '%H:%i:%s' ) ) ) ) AS total_time FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."'");
$row = mysql_fetch_array( $result );
echo $row['total_time'];
$row = mysql_fetch_array( $result );
echo $row['total_time'];
Het resultaat is 63:30:00. Hoe krijg ik nu die laatste 2 nullen eraf van seconde?
doe er nog een TIME_FORMAT() omheen in je query
Bas Cost Budde op 10/04/2012 15:29:07:
dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_time-format
doe er nog een TIME_FORMAT() omheen in je query
doe er nog een TIME_FORMAT() omheen in je query
Jammer dat hij niet werkt..
nu met time format
Code (php)
1
$result = mysql_query("SELECT SEC_TO_TIME( SUM( TIME_TO_SEC(TIME_FORMAT(totaal,'%H:%i' ) ) ) ) AS total_time FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."'");
komt misschien door TIME_TO_SEC omdat die ook een format heeft van 00:00:00?
met "omheen" bedoel ik aan de buitenkant. TIME_FORMAT(SEC_TO_TIME( enz
Code (php)
1
$result = mysql_query("SELECT TIME_FORMAT(SEC_TO_TIME( SUM( TIME_TO_SEC(totaal,'%H:%i' ) ) ) ) AS total_time FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."'");
Code (php)
1
$result = mysql_query("SELECT TIME_FORMAT(SEC_TO_TIME( SUM( TIME_TO_SEC(totaal ) ) ),'%H:%i' ) AS total_time FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."'");
Toevoeging op 10/04/2012 16:15:20:
Het is me uiteindelijk toch gelukt!
Hij moest nog binnen het laatste haakje...
Code (php)
1
$result = mysql_query("SELECT TIME_FORMAT(SEC_TO_TIME( SUM( TIME_TO_SEC(totaal ) ) ), '%H:%i' ) AS total_time FROM uren WHERE ingevuld_door = '".$_SESSION['sid']."'");
Bedankt allen! Ik ga me keer focussen op het rekenen met tijden in php:p
Trinco ingels op 10/04/2012 14:36:50:
Dus je zegt dat ik uur en minuten in een aparte kolom moet opslaan?
En dan met behulp van je script het totaal moet uitrekenen?
Opzich zou je toch ook deze tijden met elkaar moeten kunnen optellen...
Erwin H op 10/04/2012 14:25:32:
Je kan het altijd proberen, maar gezien de manier waarop het is opgeslagen geef ik je weinig kans van slagen.
Dus je zegt dat ik uur en minuten in een aparte kolom moet opslaan?
En dan met behulp van je script het totaal moet uitrekenen?
Opzich zou je toch ook deze tijden met elkaar moeten kunnen optellen...
Dat zeg ik eigenlijk wel ja (behalve dan dat als je het in twee kolommen hebt je een eenvoudige SUM() kunt doen in MySQL). Wat je nu allemaal doet is een oplossing bedenken voor een probleem dat je niet zou moeten hebben. Want wat nu als iemand in een keer 63 uur en 30 minuten in wil vullen. Ga je nu behoorlijk nat op.
Gewijzigd op 10/04/2012 16:34:23 door Erwin H