[Acces/SQL] Omrekenen minuten naar seconden

Pagina: 1
Acties:
  • 418 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
Ik ben op zoek om de tijden van een sportwedstrijd binnen een MS Acces databse via een query om te rekenen van minuten naar seconden.
Notatie: minuten:seconden,miliseconden
Dat moet ik dan omrekenen naar seconden,miliseconden.

Ik heb gegoogled maar daar staan alleen maar methode's via PHP/JavaScript etc., en nergens hoe dat in Acces te doen via een query (of anders natuurlijk).

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Kijk eens naar de functie DatePart.
Dan is het een kwestie van 60*minuten + seconden

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:18
1 minuut bestaat uit 60 seconden, 1 seconde bestaat uit 1000 milliseconden , etc....
Als je het via een query wil doen; in een query kan je rekenkundige expressies opnemen:
code:
1
select veld / 60



De rest kan je zelf wel bedenken zeker ?

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Kuhlie
  • Registratie: December 2002
  • Niet online
Anoniem: 30915 schreef op 17 oktober 2004 @ 19:39:
Notatie: minuten:seconden,miliseconden
In welk type veld zit dat? Is dat gewoon een string (Text?)?

Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
Kuhlie schreef op 17 oktober 2004 @ 20:00:
[...]


In welk type veld zit dat? Is dat gewoon een string (Text?)?
Ik heb het nu zo opgelost door de tijd in 3 velden (alle 3 strings) te zetten: heat1_M, heat1_S, heat1_MS. Hierop draai ik de volgende query:
code:
1
2
3
4
5
6
7
UPDATE RRC0405_deelnemers 
SET RRC0405_deelnemers.TijdCumulatief_heat1 = [heat1_M]*"60"+[heat1_S]+[heat1_MS]/"100", 
RRC0405_deelnemers.TijdCumulatief_heat2 = [heat2_M]/"60"+[heat2_S]+[heat2_MS]/"100", 
RRC0405_deelnemers.TijdCumulatief_heat3 = [heat3_M]/"60"+[heat3_S]+[heat3_MS]/"100", 
RRC0405_deelnemers.TijdCumulatief_heat4 = [heat4_M]/"60"+[heat4_S]+[heat4_MS]/"100", 
RRC0405_deelnemers.TijdCumulatief_heat5 = [heat5_M]/"60"+[heat5_S]+[heat5_MS]/"100", 
RRC0405_deelnemers.TijdCumulatief_heat6 = [heat6_M]/"60"+[heat6_S]+[heat6_MS]/"100";

[ Voor 10% gewijzigd door Anoniem: 30915 op 18-10-2004 11:12 . Reden: Layoutverneuking weggehaald ]


Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 03-06 06:47

ATS

Dit lijkt me geen handige oplossing. De tijd is een enkele waarde. Er is geen enkele reden om die te verdelen over meerdere velden. Bovendien is het type string ongeschikt om getallen op te slaan. Waarom zou je dat doen als je daar speciale velden voor hebt?
Ik zou gewoon gaan voor een enkel veld waar je grote integer getallen in kwijt kan, en daar de tijd in miliseconden in opslaan. Je kan daaruit via een simpele berekening elke notatie halen die je wil. Notatie-problemen horen niet de tabel thuis, maar in de interface.

Er zit aan je query te zien nog een probleem in je ontwerp: je gebruikt aparte velden per heat in in één enkele tabel. Waarom niet een tabel met deelnemers en een tabel met heats en een tabel met de tijden van de deelnemers in die heats?

Zoiets dus: deelnemers {id, naam}, heats {id, naam}, tijden {deelnemer_id, heat_id, tijd}

Nu kan je zoveel heats gebruiken als je nodig hebt zonder dat je je database weer aan moet passen.

[ Voor 8% gewijzigd door ATS op 18-10-2004 11:20 ]

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
ATS schreef op 18 oktober 2004 @ 11:19:
Dit lijkt me geen handige oplossing. De tijd is een enkele waarde. Er is geen enkele reden om die te verdelen over meerdere velden. Bovendien is het type string ongeschikt om getallen op te slaan. Waarom zou je dat doen als je daar speciale velden voor hebt?
Ik zou gewoon gaan voor een enkel veld waar je grote integer getallen in kwijt kan, en daar de tijd in miliseconden in opslaan. Je kan daaruit via een simpele berekening elke notatie halen die je wil. Notatie-problemen horen niet de tabel thuis, maar in de interface.

Er zit aan je query te zien nog een probleem in je ontwerp: je gebruikt aparte velden per heat in in één enkele tabel. Waarom niet een tabel met deelnemers en een tabel met heats en een tabel met de tijden van de deelnemers in die heats?

Zoiets dus: deelnemers {id, naam}, heats {id, naam}, tijden {deelnemer_id, heat_id, tijd}

Nu kan je zoveel heats gebruiken als je nodig hebt zonder dat je je database weer aan moet passen.
Allemaal waar, maar dat soort optimalisaties moet ik nog uitvoeren. Verder is de tabel met heats gekoppeld aan een tabel met deelnemers niet nodig, omdat er maar 6 heats zijn. Dus meer is niet nodig.
Verder is de oplossing met 3 verschillende velden niet mooi, maar wel makkelijker, dus ik denk toch dat ik daaraan vasthoudt, temeer ik niet zo'n Acces-diehard ben en het grotendeels moet hebben van proberen en F1.

Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
Ik heb me vergist in de correctiefactoren, het blijkt dat de boel omgerekend moet worden naar minuten.
De tijdsnotatie is:
minuten:seconden,centiseonden (x:y,z)
(1 centiseconde = 1/100 seconde)
Omrekenformule (naar minuten):
x+(y * 0,016666666) + (z * 0,00016666666) = tijd in minuten

Dit maak ik op uit het feit dat:
1 minuut = 1 minuut (dûh :+ )
1 seconde = 0.0166666667 minuut
1 centiseconde = 0.000166666667 minuut

Ik vermoed wel dat dit klopt, maar ik wil het graag zeker weten.Vervolgens moet ik het natuurlijk ook weer terugrekenen naar m:s,cs. Ik ben uren bezig geweest om het uit te rekenen, maar ik kom er absoluut niet uit. Hoe los ik dit in godsnaam op want ik word er knettergek van. Mocht dit kunnen via een oplossing in VBScript of een ingebouwde functie in Acces dan zou dat mooi zijn, maar een must is het niet.
Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • ReallyStupidGuy
  • Registratie: Januari 2002
  • Laatst online: 03-06 16:19
Ik weet niet hoe de syntax van VB is maar zoals al eerder gezegd:
code:
1
minuten= minuten+seconden/60+centiseconden/60/100
(is net iets precieser dan decimale notatie)
en terug naar m,s,cs zou dan iets zijn als:
code:
1
2
3
4
Minuten*60*100 =X
m=truncate(x/60/100)
s=truncate((x-m*60*100)/100)
cs=x-m*60*100-s*100

Truncate is het naar beneden afronden van een getal.

Ik geloof dat het zo goed is. Iig moet je eerst de grootste eenheid pakken, kijken wat er overblijft en verdelen onder de volgende.

Duizend wijzen kunnen meer vragen stellen dan één idioot kan beantwoorden.


Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
ReallyStupidGuy schreef op 18 oktober 2004 @ 18:19:
Ik weet niet hoe de syntax van VB is maar zoals al eerder gezegd:
code:
1
minuten= minuten+seconden/60+centiseconden/60/100
(is net iets precieser dan decimale notatie)
en terug naar m,s,cs zou dan iets zijn als:
code:
1
2
3
4
Minuten*60*100 =X
m=truncate(x/60/100)
s=truncate((x-m*60*100)/100)
cs=x-m*60*100-s*100

Truncate is het naar beneden afronden van een getal.

Ik geloof dat het zo goed is. Iig moet je eerst de grootste eenheid pakken, kijken wat er overblijft en verdelen onder de volgende.
toon volledige bericht
Dat is dus wat ik zoek, ware het niet dat, stom stom, telkens naar de verkeerde correctiefactoren heb zitten kijken. De correctiefactoren zijn gebaseerd op seconden, inmiddels ben ik zo ver dat ik de tijden naar secondes om kan zetten, en vervolgens kan corrigeren volgens de factor. Maar dan moet ik die tijd (in seconden) omzetten naar de notatie m:s,sc. Bovenstaande berekening gaat dus niet meer op en ook de optie truncate heb ik niet in een query kunnen integreren. Is er een Access-held in de zaal?

Acties:
  • 0 Henk 'm!

Anoniem: 4275

Allemaal waar, maar dat soort optimalisaties moet ik nog uitvoeren.
...
Verder is de oplossing met 3 verschillende velden niet mooi, maar wel makkelijker.
In de grote mensen wereld beginnen we altijd met een net databaseontwerpje. Dat voorkomt echt heel veel problemen in de rest van het project. Ik weet niet of je met een onetime klusje bezig bent of iets dat langer mee moet gaan. Bovendien sluipen dit soort gewoontjes er vaak bij mensen in en gaan ze het ook bij grote projecten gebruiken.

Misschien kun je eens googelen op 'database normalization' dan vind je veel nuttige info over hoe je databases netjes in elkaar zet.

Acties:
  • 0 Henk 'm!

  • ATS
  • Registratie: September 2001
  • Laatst online: 03-06 06:47

ATS

Anoniem: 30915 schreef op 18 oktober 2004 @ 21:26:
[...]
Dat is dus wat ik zoek, ware het niet dat, stom stom, telkens naar de verkeerde correctiefactoren heb zitten kijken. De correctiefactoren zijn gebaseerd op seconden ...
Correctiefactoren?! Volgens mij denk je veel te moeilijk.
Stap 1) ga uit van een tijd in een enkele eenheid. Het maakt niet zoveel uit welke, als je maar consistent blijft. Om met integers te kunnen werken (snel en precies) kan je kiezen voor miliseconden.
Stap 2) Bedenk hoe je van en naar deze basiseenheid kan converteren
Stap 3) Implementeer deze conversie in functies
Stap 4) Gebruik deze functies in je systeem, desnoods in queries (dat kan in Access)

Ad 2).
Van minuten en seconden naar miliseconden is simpel:
miliseconden = 1000 * seconden + 60 * 1000 * minuten
De andere kant op is lastiger. Daar heb je de modulo functie voor nodig. De modulo is de rest van een deling. Voorbeeld:
2/3 = 0 2%3=2 (want 2=0*3 + 2)
4/3 = 1 4%3=1 (want 4=1*3 + 1)
8/3 = 2 8%3=2 (want 8=2*3 + 2)
9/3 = 3 9%3=0 (want 9=3*3 + 0)

dus:
minuten=miliseconden/60000
seconden=(miliseconden%60000)/1000
centiseconden=(miliseconden%1000)/10

Als je kiest voor een andere basiseenheid dan veranderen de functies voor het omzetten natuurlijk, maar het idee blijft hetzelfde. Rekenen met de tijd is nu extreem simpel. Je kan in je basiseenheid gewoon optellen, aftrekken, vermenigvuldigen, delen, etc., en het resultaat kan je weer converteren naar welke notatie dan ook.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Acties:
  • 0 Henk 'm!

Anoniem: 30915

Topicstarter
Allen heel erg bedankt, ik ben een stuk verder gekomen, nu alleen nog de modulus-functie aan de praat krijgen en de boel zou moeten draaien. Het antwoord daarop hoop ik te vinden in dit topic.

(in acces bestaat modulo niet, modulus wel :z )
Pagina: 1