Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[php]SUM time telt tot 100

Pagina: 1
Acties:

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 22-11 18:34
Ik heb een stukje code om uren op te tellen. So far, so good. Echter, hij telt het aantal minuten tot 100 en niet tot 60 voordat het aantal uren omhoog gaat. Ik heb in een database een kolom Tijdverschil en ik gebruik de volgende code om op te tellen:
PHP:
1
2
3
4
5
6
7
$som_uren = "SELECT YEAR(Datum), SUM(Tijdverschil) FROM intra_uren GROUP BY YEAR(Datum)";
$result = mysql_query($som_uren) or die(mysql_error());
echo "<strong><br />Uren per jaar</strong><br />";
while($row = mysql_fetch_array($result)){
echo $row['YEAR(Datum)']. " = ". $row['SUM(Tijdverschil)'];
echo "<br />";
}

Het resultaat ziet er als volgt uit:
code:
1
2
3
Uren per jaar
2012 = 288000
2013 = 651900

Hierin zie je dus het probleem. Als er in de tabel 8:00:00 + 9:30:00 staat, telt hij 173000 als resultaat, staat er 8:50:00 + 9:30:00, telt hij 178000 ipv 182000.

Hoe kan ik dit probleem oplossen. Op deze manier is natuurlijk nooit te weten hoeveel uren en minuten er nu totaal zijn. Wie kan mij hiermee helpen? Via google kom ik de functie explode tegen, maar nergens hoe ik die kan implementeren in de sum. Moet ik eerst zorgen dat ik Tijdverschil explode? Of kan ik ook de SUM(Tijdverschil) exploden?

* Paultje3181 snapt echt te weinig van handleidingen...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Je zou alvast kunnen beginnen door niet "8:50:00" op te tellen bij "9:30:00". 8)7 Zo werkt wiskunde toch niet?

Sla gewoon UNIX timestamps op, daar kun je mee rekenen.

'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.


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

NMe schreef op vrijdag 29 maart 2013 @ 13:05:
Je zou alvast kunnen beginnen door niet "8:50:00" op te tellen bij "9:30:00". 8)7 Zo werkt wiskunde toch niet?
Het zijn "tijdsverschillen", dus ik ben benieuwd in welk datatype die kolom is gespecificeerd? Ik neem aan dat het TIME-type in MySQL gewoon met 60 minuten rekent, dus wat is het dan wel?

[ Voor 13% gewijzigd door CodeCaster op 29-03-2013 13:07 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 21-11 15:31

TheNephilim

Wtfuzzle

Als er in de tabel 8:00:00 + 9:30:00 staat, telt hij 173000 als resultaat, staat er 8:50:00 + 9:30:00, telt hij 178000 ipv 182000.
Hoe staat dat precies in je database?

  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 22-11 18:34
Tijdverschil in de database:
code:
1
5   Tijdverschil    time            Nee     Geen

@NMe: Als je tijd1 van tijd 2 af kan trekken, dan moet je toch ook op kunnen tellen lijkt me?
TheNephilim schreef op vrijdag 29 maart 2013 @ 13:42:
[...]


Hoe staat dat precies in je database?
In rij1 staat Tijdverschil 8:50:00 en in rij 2 staat Tijdverschil 9:30:00

[ Voor 40% gewijzigd door Paultje3181 op 29-03-2013 14:45 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Paultje3181 schreef op vrijdag 29 maart 2013 @ 14:44:
Tijdverschil in de database:
code:
1
5   Tijdverschil    time            Nee     Geen

@NMe: Als je tijd1 van tijd 2 af kan trekken, dan moet je toch ook op kunnen tellen lijkt me?
Rekenen met tijden is nooit een goed idee. Dat kun je veel beter met daarvoor geschikt gemaakte structuren (DateTime-object in PHP bijvoorbeeld) of timestamps doen.

'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.


  • Gtoniser
  • Registratie: Januari 2008
  • Laatst online: 22:47
Als je gewoon de basiseenheid van tijd gebruikt overal voor (secondes dus) dan krijg je zulke problemen niet.
Geen idee waarom dit precies niet werkt maar een time type is niet om tijdsverschillen op te slaan maar gewoon tijden.

Edit:
Kijk eens voor het eerste antwoord hier voor een oplossing:
http://stackoverflow.com/...ulate-sum-time-with-mysql

[ Voor 23% gewijzigd door Gtoniser op 29-03-2013 14:55 ]


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

NMe schreef op vrijdag 29 maart 2013 @ 14:52:
[...]

Rekenen met tijden is nooit een goed idee. Dat kun je veel beter met daarvoor geschikt gemaakte structuren (DateTime-object in PHP bijvoorbeeld) of timestamps doen.
Het TIME-type is bedoeld voor het opslaan van tijden:
MySQL retrieves and displays TIME values in 'HH:MM:SS' format (or 'HHH:MM:SS' format for large hours values). TIME values may range from '-838:59:59' to '838:59:59'. The hours part may be so large because the TIME type can be used not only to represent a time of day (which must be less than 24 hours), but also elapsed time or a time interval between two events (which may be much greater than 24 hours, or even negative).
Je kunt een (calculated) TIME-kolom maken, waarmee je bijvoorbeeld het aantal gewerkte uren op een dag kunt weergeven.

Het lijkt me dan ook niet raar om te verwachten dat je kolommen van een dergelijk type gemakkelijk kunt optellen, toch blijkt dat MySQL's SUM niet goed met zo'n kolom omgaat. Gelukkig is er op [google=mysql sum time] genoeg te vinden, waaronder de door Gtoniser geposte oplossing:
SQL:
1
SELECT SEC_TO_TIME(SUM(SECOND(mytime)))

[ Voor 7% gewijzigd door CodeCaster op 29-03-2013 15:06 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • pedorus
  • Registratie: Januari 2008
  • Niet online
In de manual staat het ook gewoon:
The SUM() and AVG() aggregate functions do not work with temporal values. (They convert the values to numbers, losing everything after the first nonnumeric character.) To work around this problem, convert to numeric units, perform the aggregate operation, and convert back to a temporal value. Examples:
SQL:
1
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Paultje3181
  • Registratie: November 2002
  • Laatst online: 22-11 18:34
Het is nu inderdaad gelukt... Nu je het zegt pedorus snap ik wat er staat, maar zelden zo'n onhandig handboek gezien... Dankjulliewel allemaal...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

CodeCaster schreef op vrijdag 29 maart 2013 @ 15:04:
[...]

Het lijkt me dan ook niet raar om te verwachten dat je kolommen van een dergelijk type gemakkelijk kunt optellen, toch blijkt dat MySQL's SUM niet goed met zo'n kolom omgaat. Gelukkig is er op [google=mysql sum time] genoeg te vinden, waaronder de door Gtoniser geposte oplossing:

[...]
offtopic:
Een timestamp is ook een timestamp als het ijkpunt niet op 1 januari 1970 ligt. :P

'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.

Pagina: 1