Toon posts:

[PHP] [SQL] Datum en tijd in MYSQL-database

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goeden middag allen,

Ik ben bezig om een uren-registratieformulier te bouwen m.b.v. PHP en een MYSQL-database. Hierin plaats ik de volgende kolommen:

-De aankomsttijd (in het formaat HH:MM; bijvoorbeeld 09:00)
-De vertrektijd
-De datum van de desbetreffende dag.

Omdat ik meerdere aankomst- en vertrektijden te gelijk invoer, heb ik een apart Datum input-field in mijn HTML gemaakt waarbij ik slechts één keer de datum hoef in te voeren.

Nu heb ik echter een probleem. Wanneer ik deze tijden in mijn database opsla onder de categorie "Time" en ik later deze twee waarden van elkaar afhaal, krijg ik enkel de hele uren. 09:35-09:00 wordt bijvoorbeeld 0 uur.

Ik heb zelf geprobeerd om dit op te lossen door het gebruik van een DateTime indeling in mijn database (Dus ook de datum erbij zetten). Echter krijg ik hier telkens 00-00-0000 00:00 terug wanneer ik de waarden wegschrijf naar de database.

Hoe kan ik dit oplossen?

Groet,
Tim

Beste antwoord (via Verwijderd op 18-05-2018 11:14)


  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$tijd1 = '10:30'; // Komt uit DB
$tijd2 = '09:20'; // Komt uit DB

$dif = strtotime($tijd1) - strtotime($tijd2); // In seconden => 4200

// Functie om seconden om te katten naar HH:MM
function secToHours($seconds) {
  $hours = floor($seconds / 3600);
  $minutes = floor(($seconds / 60) % 60);
  return sprintf('%02d', $hours).":".sprintf('%02d', $minutes);
}

echo secToHours($dif); // Output => 01:10


Edit: Misschien niet helemaal goed gelezen. Probeer je nu te rekenen met je tijden in SQL of in PHP?

[ Voor 11% gewijzigd door Harrie_ op 17-05-2018 16:52 ]

Hoeder van het Noord-Meierijse dialect

Alle reacties


Acties:
  • 0 Henk 'm!

  • Rannasha
  • Registratie: Januari 2002
  • Laatst online: 17:43

Rannasha

Does not compute.

Laat eens wat code zien.

|| Vierkant voor Wiskunde ||


Acties:
  • +1 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
'00-00-0000 00:00' bestaat niet. Je moet de ISO 8601 notatie hebben.
En we zullen maar geen boekje open doen over timezone afhandeling :+
In Cola, of anders wat Rannasha zegt ;)

[ Voor 40% gewijzigd door DJMaze op 17-05-2018 16:44 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$tijd1 = '10:30'; // Komt uit DB
$tijd2 = '09:20'; // Komt uit DB

$dif = strtotime($tijd1) - strtotime($tijd2); // In seconden => 4200

// Functie om seconden om te katten naar HH:MM
function secToHours($seconds) {
  $hours = floor($seconds / 3600);
  $minutes = floor(($seconds / 60) % 60);
  return sprintf('%02d', $hours).":".sprintf('%02d', $minutes);
}

echo secToHours($dif); // Output => 01:10


Edit: Misschien niet helemaal goed gelezen. Probeer je nu te rekenen met je tijden in SQL of in PHP?

[ Voor 11% gewijzigd door Harrie_ op 17-05-2018 16:52 ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • +3 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 18:27
Ik zie het probleem niet als je precies hebt geïmplementeerd wat je zegt te hebben gedaan:
http://sqlfiddle.com/#!9/bdca32/6

Ook even uitgeschreven:
MySQL:
1
2
3
4
5
6
7
8
create table test (
  a time,
  b time
 );
 
insert into test values ('09:35', '09:00');

select cast((a-b) as time) from test;

Resultaat is: 00:35:00

[ Voor 44% gewijzigd door CurlyMo op 17-05-2018 16:52 ]

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

TS is weer verdwenen?

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 18:27
Zijn eerste en enige bericht, dus zou zomaar kunnen.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goede morgen allen,

Dank voor jullie antwoorden. Ik ben vrij druk; vandaar dat ik gisteren na het posten van het topic niet meer heb gekeken. Ik ben positief verrast door het grote aantal antwoorden!

Dan nu:

Mijn probleem is opgelost. Ik heb de code van Harrie_ gebruikt, en heb nu een werkende code :)
@Harrie_ Je hebt het zeker goed gelezen, ik wilde rekenen in PHP. Ik heb je code gebruikt, het strtotime(); gedeelte kwam ik niet helemaal uit: dit is precies de hulp die ik nodig had :)

Dank jullie wel voor de hulp!

Tim

[ Voor 61% gewijzigd door Verwijderd op 18-05-2018 11:14 . Reden: Probleem opgelost ]


Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 18:27
Verwijderd schreef op vrijdag 18 mei 2018 @ 10:45:
@Harrie_ Je hebt het zeker goed gelezen, ik wilde rekenen in PHP. Ik heb je code gebruikt, het strtotime(); gedeelte kwam ik niet helemaal uit: dit is precies de hulp die ik nodig had :)
Ik hoop wel dat je ziet dat de code van @Harrie_ een heel stuk minder efficiënt is dan dit gewoon in je database te doen. De database kan gewoon direct time waardes van elkaar aftrekken zonder dat je als gebruiker allemaal conversies hoeft te doen.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

@Verwijderd @CurlyMo Dat klopt zeker; ik kan wel wat cases verzinnen waarbij je onder bepaalde omstandigheden in PHP een verschil wil uitrekenen maar door de boot genomen kun je beter zoals CurlyMo zegt in SQL de berekening doen en de waarde gewoon met je dataset laten retourneren.

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
Harrie_ schreef op vrijdag 18 mei 2018 @ 14:50:
ik kan wel wat cases verzinnen waarbij je onder bepaalde omstandigheden in PHP een verschil wil uitrekenen.
Ik niet, MySQL ondersteund ook "112:56" (dus 112 uur).
Handig als je meer dan 23:59 uur aan een opdracht werkt (maar niet meer dan 838:59:59) ;)

[ Voor 13% gewijzigd door DJMaze op 18-05-2018 15:52 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

  • Harrie_
  • Registratie: Juli 2003
  • Niet online

Harrie_

⠀                  🔴 🔴 🔴 🔴 🔴

@DJMaze Kun je geen enkele case verzinnen waarbij je in PHP de berekening doet? Dus als je allerlei logica moet toepassen wanneer er wel of niet berekend wordt en onder welke voorwaarden dan voeg je in query een case-when van een kantje toe?

[ Voor 5% gewijzigd door Harrie_ op 18-05-2018 16:26 ]

Hoeder van het Noord-Meierijse dialect


Acties:
  • 0 Henk 'm!

  • DJMaze
  • Registratie: Juni 2002
  • Niet online
@Harrie_ de logica zit dan volgens mij verkeerd in elkaar.
Kan namelijk echt niks bedenken en bij "urenregistratie" ben ik toch echt de gekste dingen tegen gekomen (ziekte, verzuim, pauzes, work-billable, work-unbillable, etc., etc.).
Ik had zeg maar gewoon een "type" kolom en dan "GROUP BY type" ofzo, en dan zag ik ook alles zonder CASE...WHEN.

De enige case die ik had was COALESCE(eindtijd, NOW())

[ Voor 32% gewijzigd door DJMaze op 18-05-2018 17:00 ]

Maak je niet druk, dat doet de compressor maar


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
CurlyMo schreef op vrijdag 18 mei 2018 @ 11:43:
[...]

Ik hoop wel dat je ziet dat de code van @Harrie_ een heel stuk minder efficiënt is dan dit gewoon in je database te doen. De database kan gewoon direct time waardes van elkaar aftrekken zonder dat je als gebruiker allemaal conversies hoeft te doen.
Ja, dat begrijp ik absoluut! Echter, ik gebruik deze tijden ook voor de individuele urenadministratie (per record), maar ook om per datum (meerdere records kunnen dezelfde datum hebben; iedere gebruiker heeft zijn eigen record op een bepaalde datum) de hoogste en laagste tijd te nemen, om zo te berekenen hoelang we open zijn geweest.

Allen, bedankt voor de hulp!

Tim

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 18:27
Verwijderd schreef op vrijdag 18 mei 2018 @ 22:51:
[...]
Ja, dat begrijp ik absoluut! Echter, ik gebruik deze tijden ook voor de individuele urenadministratie (per record), maar ook om per datum (meerdere records kunnen dezelfde datum hebben; iedere gebruiker heeft zijn eigen record op een bepaalde datum) de hoogste en laagste tijd te nemen, om zo te berekenen hoelang we open zijn geweest.
Als ik goed begrijp wat je zegt kan je dat ook gewoon in één keer via SQL :)

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • 0 Henk 'm!

  • Donderpoes
  • Registratie: April 2011
  • Laatst online: 11-05 23:09
Verwijderd schreef op vrijdag 18 mei 2018 @ 22:51:
[...]


Ja, dat begrijp ik absoluut! Echter, ik gebruik deze tijden ook voor de individuele urenadministratie (per record), maar ook om per datum (meerdere records kunnen dezelfde datum hebben; iedere gebruiker heeft zijn eigen record op een bepaalde datum) de hoogste en laagste tijd te nemen, om zo te berekenen hoelang we open zijn geweest.

Allen, bedankt voor de hulp!

Tim
Group by date en dan de MIN(tijd) aftrekken van de MAX(tijd)
Pagina: 1