[MySQL] Delen van tijd

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
Normaal gesproken post ik geen programmeer vragen aangezien ik er al gauw zelf uit kom, nu is dat helaas niet zo.
Ik probeer twee tijden in een query te delen, en dat gaat hoe dan ook niet goed:

Simpel voorbeeld:
SQL:
1
SELECT ('40:00:00 / '05:00:00') 


Allerlei variaties geprobeerd, ook manual van MySQL nagelezen, etc. Volgens mij zie ik echt iets over het hoofd.

Laatste probeersel is trouwens:
SQL:
1
2
3
4
5
SELECT (
        (CAST('45:00:00') AS TIME) 
        /  
        (CAST('07:00:00') AS TIME)
       )


Wie o wie heeft hier betere ervaringen mee?

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 19-09 19:31

Glewellyn

is er ook weer.

Heb je al eens naar de TIME_TO_SEC(time) functie gekeken?

*zucht*


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
Aha, ik heb het even nagezocht. En dan delen, en daarna SEC_TO_TIME doen.

Ik post het resultaat zometeen hier.

EDIT:
Helaas komt MySQL op 7 seconden i.p.v. 7 uren:
SQL:
1
2
3
4
SELECT SEC_TO_TIME(
                        TIME_TO_SEC('35:00:00') 
                       / TIME_TO_SEC('05:00:00')
                        )

[ Voor 58% gewijzigd door kvdd op 14-01-2011 11:32 ]


Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 19-09 19:31

Glewellyn

is er ook weer.

Never mind... ik begreep je even verkeerd.

[ Voor 83% gewijzigd door Glewellyn op 14-01-2011 11:33 . Reden: Beetje traag van begrip. ]

*zucht*


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
Glewellyn schreef op vrijdag 14 januari 2011 @ 11:32:
Nu weet ik niet precies wat je wil bereiken, maar volgens mij moet je zoiets doen:

SQL:
1
2
3
4
5
SELECT (
        (TIME_TO_SEC('45:00:00')) 
        /  
        (TIME_TO_SEC('07:00:00'))
       )
Ja dat klopt, en dan heb je idd een deling met seconden. Seconden zijn goed te delen, komt netjes een duizendtal uit, maar als ik dan SEC_TO_TIME doe komen er helaas seconden uitrollen.

Edit: Hmm het ligt aan de decimale punt. SEC_TO_TIME('7.000') gaat fout, SEC_TO_TIME('7000') gaat prima.

[ Voor 9% gewijzigd door kvdd op 14-01-2011 11:36 ]


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 22-09 10:35

Knutselsmurf

LED's make things better

Er komen geen seconden, en ook geen uren uit. Zoals je het nu doet, komt er 5 uit. En dat klopt. Als je er uren ( of seconden, of minuten) uit wilt krijgen, moet je niet delen door 7 UUR, maar door 7.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Misschien niet helemaal netjes maar:
SQL:
1
2
3
4
5
6
7
SELECT SEC_TO_TIME(
(
        (TIME_TO_SEC('45:00:00')) 
        /  
        (TIME_TO_SEC('07:00:00'))
       )*3600
)

Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 19-09 19:31

Glewellyn

is er ook weer.

Joolee schreef op vrijdag 14 januari 2011 @ 11:40:
Misschien niet helemaal nietjes maar:
code:
1
2
3
4
5
6
7
SELECT SEC_TO_TIME(
(
        (TIME_TO_SEC('45:00:00')) 
        /  
        (TIME_TO_SEC('07:00:00'))
       )*3600
)
vermenigvuldigen met 3600? Delen kan ik me nog voorstellen. Maar dan krijg je een aantal uren met decimale notatie.

*zucht*


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
Knutselsmurf schreef op vrijdag 14 januari 2011 @ 11:38:
Er komen geen seconden, en ook geen uren uit. Zoals je het nu doet, komt er 5 uit. En dat klopt. Als je er uren ( of seconden, of minuten) uit wilt krijgen, moet je niet delen door 7 UUR, maar door 7.
Dat klopt inderdaad (wat ook erg logisch is) :$

De volgende code werkt prima:
SQL:
1
2
3
4
5
6
7
SELECT SEC_TO_TIME(
(
        (TIME_TO_SEC('40:00:00')) 
        /  
        5
       )
)


Edit:
@Glewellyn en Joolee:
Jou code werkt inderdaad, maar is inderdaad meer een workaround ;)

[ Voor 8% gewijzigd door kvdd op 14-01-2011 11:47 ]


Acties:
  • 0 Henk 'm!

  • Glewellyn
  • Registratie: Januari 2001
  • Laatst online: 19-09 19:31

Glewellyn

is er ook weer.

kvdd schreef op vrijdag 14 januari 2011 @ 11:44:
[...]


Dat klopt inderdaad (wat ook erg logisch is) :$

De volgende code werkt prima:
SQL:
1
2
3
4
5
6
7
SELECT SEC_TO_TIME(
(
        (TIME_TO_SEC('40:00:00')) 
        /  
        5
       )
)
Kan ik me niet voorstellen, je opent meer haakjes dan dat je sluit. :D

edit:
Ik moet vandaag echt beter opletten :X
Het zijn er misschien wel meer dan nodig. Is dit niet genoeg?

SQL:
1
2
3
4
5
SELECT SEC_TO_TIME(
        TIME_TO_SEC('40:00:00') 
        /  
        5
)

[ Voor 21% gewijzigd door Glewellyn op 14-01-2011 11:50 ]

*zucht*


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
Glewellyn schreef op vrijdag 14 januari 2011 @ 11:45:
[...]


Kan ik me niet voorstellen, je opent meer haakjes dan dat je sluit. :D

edit:
Ik moet vandaag echt beter opletten :X
Het zijn er misschien wel meer dan nodig
Haha! Ik wou al zoiets zeggen als: "het gaat om het principe he!" >:) Maar het klopt inderdaad.

[ Voor 3% gewijzigd door kvdd op 14-01-2011 11:50 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Heb je een logische reden om dit te doen, en minstens net zo belangrijk: een logische reden om het te doen in een query in plaats van in code? Rekenen met tijd is lastiger dan het lijkt door de vele uitzonderingssituaties zoals schrikkeljaren, zomer- en wintertijd en zelfs schrikkelsecondes. Weet je zeker dat je je daaraan wil wagen en je het probleem niet anders kan oplossen?

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


Acties:
  • 0 Henk 'm!

  • Staatslot
  • Registratie: December 2007
  • Laatst online: 02-09 09:58
NMe schreef op vrijdag 14 januari 2011 @ 12:06:
Heb je een logische reden om dit te doen, en minstens net zo belangrijk: een logische reden om het te doen in een query in plaats van in code? Rekenen met tijd is lastiger dan het lijkt door de vele uitzonderingssituaties zoals schrikkeljaren, zomer- en wintertijd en zelfs schrikkelsecondes. Weet je zeker dat je je daaraan wil wagen en je het probleem niet anders kan oplossen?
Was ook mijn eerste reactie, kun je uitleggen waar je dit voor wilt gebruiken of als het kan het stuk code posten waarin dit wordt gebruikt?

Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
@NMe: Het gaat om het delen van de contracttijd door het aantal dagen dat men werkt (parttimers < 5). Dat los ik liever in de query op, die de data toch moet ophalen.

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

kvdd schreef op vrijdag 14 januari 2011 @ 12:13:
@NMe: Het gaat om het delen van de contracttijd door het aantal dagen dat men werkt (parttimers < 5). Dat los ik liever in de query op, die de data toch moet ophalen.
Contracttijd hebt je altijd in uren. Dagen zijn ook gehele getallen. Gewoon een deling doen tussen die twee getallen (wel zorgen dat je een double terugkrijgt) en in je code functie schrijven die dat om kan zetten naar een tijdsnotatie is een stukje robuuster dan het truukje dat je nu toepast. :)

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


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
kvdd schreef op vrijdag 14 januari 2011 @ 11:23:
Helaas komt MySQL op 7 seconden i.p.v. 7 uren:
SQL:
1
2
3
4
SELECT SEC_TO_TIME(
                        TIME_TO_SEC('35:00:00') 
                       / TIME_TO_SEC('05:00:00')
                        )
Maar waarom verwacht je dat (35 uur / 5uur) gelijk is aan 7 uur? Dat vind ik persoonlijk helemaal niet logisch.

Tijd gedeeld door tijd levert IMHO helemaal geen tijd op, maar een verhouding. Zoals NME zegt, moet je de contracttijd gewoon delen door het aantal dagen, dan kom je op het aantal uur per dag uit.

[ Voor 10% gewijzigd door Woy op 14-01-2011 12:58 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • kvdd
  • Registratie: Oktober 2004
  • Laatst online: 30-01 09:37
@Woy en NMe,

De (denk)fout was inderdaad dat ik tijd door tijd probeerde te delen. Wat in MySQL ook niet werkte. Wat de functie voor het omzetten betreft. Dat is inderdaad een stuk robuuster, maar ook nettere afhandeling in code.

Echter probeer ik nu met één query alle data precies zo te hebben zoals ik het wil. Als het lukt, en foutloos werkt, dan is dat voor mij een stuk overzichtelijker en makkelijker in het afhandelen van het queryresultaat.

Iedereen bedankt voor de reacties!
Pagina: 1