Rekenen met VARCHAR
Chilion - 20/11/2008 18:52 (laatste wijziging 20/11/2008 23:56)
MySQL interesse
Heren, Dames,
Een zeer leuke uitdaging, maar niet heus.
Gekregen heb ik:
begintijd (varchar)
eindtijd (varchar)
uren (decimal)
Nu moet begintijd (00:00) dus van eindtijd (00:00) afgetrokken worden.
De uren moeten dus berekend worden. Het gaat hier om een MsSql omgeving.
Erg stom om je tijden als varchar op te slaan, dat heb ik deze klant ook duidelijk gemaakt ondertussen, probleem blijft wel. Hoe ga ik dit oplossen?
Chilion
22 antwoorden
Gesponsorde links
henver - 20/11/2008 19:01 (laatste wijziging 20/11/2008 19:09)
HTML gevorderde
$begintijd = $row['begintijd'];
$eindtijd = $row['eindtijd'];
$begintijd = explode(':', $begintijd);
$begintijd_uur = $begintijd[0];
$begintijd_minuten = $begintijd[1];
$begintijd = mktime($begintijd_uur, $begintijd_minuten, 0, 0, 0, 0);
$eindtijd = explode(':', $eindtijd);
$eindtijd_uur = $eindtijd[0];
$eindtijd_minuten = $eindtijd[1];
$eindtijd = mktime($eindtijd_uur, $eindtijd_minuten, 0, 0, 0, 0);
$verschil = $begintijd - $eindtijd;
$verschil = date("H:i", $verschil);
echo $verschil;
$begintijd = $row [ 'begintijd' ] ;
$eindtijd = $row [ 'eindtijd' ] ;
$begintijd = explode ( ':' , $begintijd ) ; $begintijd_uur = $begintijd [ 0 ] ;
$begintijd_minuten = $begintijd [ 1 ] ;
$begintijd = mktime ( $begintijd_uur , $begintijd_minuten , 0 , 0 , 0 , 0 ) ;
$eindtijd = explode ( ':' , $eindtijd ) ; $eindtijd_uur = $eindtijd [ 0 ] ;
$eindtijd_minuten = $eindtijd [ 1 ] ;
$eindtijd = mktime ( $eindtijd_uur , $eindtijd_minuten , 0 , 0 , 0 , 0 ) ;
$verschil = $begintijd - $eindtijd ;
$verschil = date ( "H:i" , $verschil ) ;
Zoiets misschien?
Wim - 20/11/2008 19:04
Crew algemeen
Volgens mij is het makkelijker om 2 DATE, DATETIME of TIME velden te gebruiken (je kan deze converteren met een klein scriptje) en vevolgens kan je MySQL.com: DATEDIFF() gebruiken
Chilion - 20/11/2008 19:30
MySQL interesse
Hmm, ik ben wat verder, ik heb nu dit:
begintijd(smalldatetime)(1-1-1900 00:00:00)
eindtijd(smalldatetime)(1-1-1900 00:00:00)
uren(int)
Maar, hoe bereken ik nu vanuit de begin en eindtijd de uren?
Chilion
Wim - 20/11/2008 19:40
Crew algemeen
Google.be: datediff mssql
Post maar een deel van je code, dan sturen we wel bij.
Trouwens, volgens mij heb je net ALLE tijden uit je database verwijderd...
@henver
Citaat:
$begintijd = explode(':', $begintijd);
$begintijd_uur = $begintijd[0];
$begintijd_minuten = $begintijd[1];
list($begintijd_uur, $begintijd_minuten) = explode(':', $begintijd);
list ( $begintijd_uur , $begintijd_minuten ) = explode ( ':' , $begintijd ) ;
Chilion - 20/11/2008 19:43
MySQL interesse
Deze query:
SELECT SUM('eindtijd - begintijd') AS uurtjes
from UVTplay
SELECT SUM( 'eindtijd - begintijd' ) AS uurtjes
from UVTplay
geeft deze foutmelding:
Citaat:
Server: Msg 409, Level 16, State 2, Line 1
The sum or average aggregate operation cannot take a varchar data type as an argument.
Kr4nKz1n - 20/11/2008 19:46
Onbekend
henver schreef:
[..code..]
Zoiets misschien?
Waarom voor alles een aparte variabele weer maken? De gene die dit gebruikt weet dat $begintijd en $eindtijd array`s zijn. Deze kun je gewoon gebruiken op de manier hoe je de andere variabelen vult.
Je hebt op deze manier meer code, en ik vind het zelf onverzichtelijker. Als je dan toch perse normale naamgevingen wilt hebben, zie het voorbeeld van wimmarien.
Chilion - 20/11/2008 19:53
MySQL interesse
Tsja Rens,
SELECT DATEDIFF('eindtijd - begintijd') AS uurtjes
from UVTplay
SELECT DATEDIFF( 'eindtijd - begintijd' ) AS uurtjes
from UVTplay
geeft deze foutmelding:
Citaat:
Server: Msg 174, Level 15, State 1, Line 1
The datediff function requires 3 arguments.
Chilion - 20/11/2008 19:58
MySQL interesse
Aan die links heb ik dus niet, want voor mijn situatie werken die niet.
Die had ik ook gevonden inderdaad, maar ze helpen dus niet.
Rens - 20/11/2008 19:59
Crew algemeen
Waarom zou dat niet voor jou werken?
DATEDIFF(hh, eindtijd, begintijd)
DATEDIFF( hh, eindtijd, begintijd)
Als je dat doet, welke error krijg je dan?
Chilion - 20/11/2008 20:23
MySQL interesse
Nee, hij geeft overal een minnetje voor. (A)
Chilion - 20/11/2008 21:39
MySQL interesse
Nee ook niet, hij rond alles af.
Chilion - 21/11/2008 13:21
MySQL interesse
Nee, je snapt me niet. Ik wil dat hij, als er bijvoorbeeld 90 minuten zijn, dat hij weer geeft dat het 1.5 uur is. Dat heb ik nu al, in de vorm van deze query:
SELECT DATEDIFF(mi, begintijd, eindtijd) AS totaalminuten,
uren = CAST(DATEDIFF(mi, begintijd, eindtijd) as decimal(5,2)) / (60),
minutenrestant = (DATEDIFF(mi, begintijd, eindtijd) - ((DATEDIFF(mi, begintijd, eindtijd) / (60)) * 60)) / 60,
cast(DATEDIFF(mi, begintijd, eindtijd) / (60) as varchar) + ':' +
cast(DATEDIFF(mi, begintijd, eindtijd) - ((DATEDIFF(mi, begintijd, eindtijd) / (60)) * 60) as varchar) AS totaal
FROM UVTPlay
SELECT DATEDIFF( mi, begintijd, eindtijd) AS totaalminuten,
uren = CAST( DATEDIFF( mi, begintijd, eindtijd) as decimal( 5 , 2 ) ) / ( 60 ) ,
minutenrestant = ( DATEDIFF( mi, begintijd, eindtijd) - ( ( DATEDIFF( mi, begintijd, eindtijd) / ( 60 ) ) * 60 ) ) / 60 ,
cast( DATEDIFF( mi, begintijd, eindtijd) / ( 60 ) as varchar) + ':' +
cast( DATEDIFF( mi, begintijd, eindtijd) - ( ( DATEDIFF( mi, begintijd, eindtijd) / ( 60 ) ) * 60 ) as varchar) AS totaal
FROM UVTPlay
Alleen krijg ik nog geen 0.5 maar .5
En dat moet nog anders, en er staan veel te veel decimalen.
Chilion
Gesponsorde links
Dit onderwerp is gesloten .