login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Rekenen met VARCHAR

Offline Chilion - 20/11/2008 18:52 (laatste wijziging 20/11/2008 23:56)
Avatar van ChilionMySQL 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
Offline henver - 20/11/2008 19:01 (laatste wijziging 20/11/2008 19:09)
Avatar van henver HTML gevorderde
  1. $begintijd = $row['begintijd'];
  2. $eindtijd = $row['eindtijd'];
  3.  
  4. $begintijd = explode(':', $begintijd);
  5. $begintijd_uur = $begintijd[0];
  6. $begintijd_minuten = $begintijd[1];
  7. $begintijd = mktime($begintijd_uur, $begintijd_minuten, 0, 0, 0, 0);
  8.  
  9. $eindtijd = explode(':', $eindtijd);
  10. $eindtijd_uur = $eindtijd[0];
  11. $eindtijd_minuten = $eindtijd[1];
  12. $eindtijd = mktime($eindtijd_uur, $eindtijd_minuten, 0, 0, 0, 0);
  13.  
  14. $verschil = $begintijd - $eindtijd;
  15. $verschil = date("H:i", $verschil);
  16.  
  17. echo $verschil;


Zoiets misschien?
Offline Wim - 20/11/2008 19:04
Avatar van Wim 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
Offline Chilion - 20/11/2008 19:09 (laatste wijziging 20/11/2008 19:18)
Avatar van Chilion MySQL interesse Tsja, maar ik heb MSSQL 

Dat PHP gedeelte werkt op de een of andere manier niet...
Offline Rens - 20/11/2008 19:25
Avatar van Rens Gouden medaille

Crew algemeen
DATEDIFF bestaat ook in MSSQL, dus dat is het probleem niet...
Ik ben het met wimmarien eens, je kunt het beste eerst al je data omzetten zodat je veld types gewoon kloppen.
Daarna is het een fluitje van 1 of 2 centen... :-)
Offline Chilion - 20/11/2008 19:30
Avatar van Chilion 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
Offline Wim - 20/11/2008 19:40
Avatar van Wim 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];

  1. list($begintijd_uur, $begintijd_minuten) = explode(':', $begintijd);
Offline Chilion - 20/11/2008 19:43
Avatar van Chilion MySQL interesse Deze query:

  1. SELECT SUM('eindtijd - begintijd') AS uurtjes
  2. 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.
Offline Kr4nKz1n - 20/11/2008 19:46
Avatar van Kr4nKz1n 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.
Offline Rens - 20/11/2008 19:46
Avatar van Rens Gouden medaille

Crew algemeen
Daarom moet je dus ook DATEDIFF gebruiken en niet SUM.
Sum is om de totale waarden van velden op te tellen en niet om een verschil in tijd uit te rekenen.
Offline Chilion - 20/11/2008 19:53
Avatar van Chilion MySQL interesse Tsja Rens,

  1. SELECT DATEDIFF('eindtijd - begintijd') AS uurtjes
  2. from UVTplay


geeft deze foutmelding:
Citaat:
Server: Msg 174, Level 15, State 1, Line 1
The datediff function requires 3 arguments.
Offline Rens - 20/11/2008 19:56
Avatar van Rens Gouden medaille

Crew algemeen
Ik zie het probleem al en ik maak uit je vraag ook op dat je nog niet op google gezocht hebt.
http://www.goog...n&meta=
Eerste hit:
http://forums.d...hp?t=43174
Zoals je daar ziet moet je eerst aangeven wat je terug wilt krijgen en daarna de 2 data.

Volgende keer eerst even zoeken!
Offline Chilion - 20/11/2008 19:58
Avatar van Chilion 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.
Offline Rens - 20/11/2008 19:59
Avatar van Rens Gouden medaille

Crew algemeen
Waarom zou dat niet voor jou werken?
  1. DATEDIFF(hh, eindtijd, begintijd)

Als je dat doet, welke error krijg je dan?
Offline Chilion - 20/11/2008 20:19
Avatar van Chilion MySQL interesse Dan krijg ik een mooi lijstje, met overal een - voor 
Offline Rens - 20/11/2008 20:22
Avatar van Rens Gouden medaille

Crew algemeen
Is je probleem nu dus opgelost als ik het goed begrijp?
Offline Chilion - 20/11/2008 20:23
Avatar van Chilion MySQL interesse Nee, hij geeft overal een minnetje voor. (A)
Offline Rens - 20/11/2008 20:37
Avatar van Rens Gouden medaille

Crew algemeen
Maar de uitkomsten kloppen wel?
Offline Chilion - 20/11/2008 21:39
Avatar van Chilion MySQL interesse Nee ook niet, hij rond alles af.
Offline Rens - 20/11/2008 21:47 (laatste wijziging 20/11/2008 23:14)
Avatar van Rens Gouden medaille

Crew algemeen
Dan moet je aangeven dat hij ook minuten moet geven i.p.v. alleen uren.
http://msdn.microsoft.com/en-us/library/aa258269(SQL.80).aspx
Offline Chilion - 21/11/2008 11:59 (laatste wijziging 21/11/2008 12:10)
Avatar van Chilion MySQL interesse SELECT DATEDIFF(mi, eindtijd, begintijd) AS uurtjes
from UVTplay

Minnetjes zijn opgelost, maar nu wil ik gewoon de totaal uren.

Help me verder 

Chilion
Offline Rens - 21/11/2008 12:39
Avatar van Rens Gouden medaille

Crew algemeen
Delen door 60  
Offline Chilion - 21/11/2008 13:21
Avatar van Chilion 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:

  1. SELECT DATEDIFF(mi, begintijd, eindtijd) AS totaalminuten,
  2. uren = CAST(DATEDIFF(mi, begintijd, eindtijd) as decimal(5,2)) / (60),
  3. minutenrestant = (DATEDIFF(mi, begintijd, eindtijd) - ((DATEDIFF(mi, begintijd, eindtijd) / (60)) * 60)) / 60,
  4. cast(DATEDIFF(mi, begintijd, eindtijd) / (60) as varchar) + ':' +
  5. cast(DATEDIFF(mi, begintijd, eindtijd) - ((DATEDIFF(mi, begintijd, eindtijd) / (60)) * 60) as varchar) AS totaal
  6. 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.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.359s