[PHP/MySQL] rekenen met werkdagen

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
Aangezien ik niet zo'n zin heb om bepaalde wielen opnieuw uit te vinden, hier maar een topic.

Ik ben momenteel bezig met het ontwerpen van een queue systeem voor repro(ductie) opdrachten hier binnen het bedrijf (as in grote print opdrachten enzo)
De opdrachten komen in een queue, die worden netjes weergegeven, en de repro afdeling kan deze in behandeling nemen en afsluiten enzo.

Da's allemaal niet zo belangrijk, wat belangrijker is, is dat er gerekend moet worden met levertijden in werkdagen. Aangezien deze nogal verschillen, ben ik dus op zoek naar een universele functie om dit te berekenen.


Mijn gedachte was eerst om dit te doen met MySQL, maar hierbij kom ik er dus helemaal niet uit.

Ik had het volgende:

SQL:
1
select date_add(current_date(), interval 5 days );

(dit zorgt er dus voor dat er 5 dagen opgeteld worden bij de huidige datum)
Daar wordt dan de dag van de week uit gepakt, en daarvoor wordt gekeken of er een zaterdag en zondag tussen zit. Zo ja, worden deze er uit gefilterd en bij het resultaat opgeteld

Maar dit komt nu dus al ongeveer tegen de 20 á 30 regels code, wat me niet de bedoeling lijkt :{

Zijn er hier makkelijkere manieren voor :? Het mooiste zou zijn om dit in bijv. 1 sql query te regelen, dat was m'n doel ook eigenlijk, maar daar is m'n sql kennis nog niet groot genoeg voor :(

[ Voor 3% gewijzigd door SchizoDuckie op 03-10-2003 16:55 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • RedRose
  • Registratie: Juni 2001
  • Niet online

RedRose

Icebear

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function calcInterval($leverTijd)
{
    $num = 0;

    for ($i = 1;$i < ($leverTijd+1);$i++)
    {
        if ((date('w',mktime (0,0,0,date("m"),(date("d")+$i),date("Y")))) == 6)
        {
            $num++;
        }
    }

return ($leverTijd+(2*$num));
}

$leverTijd = 15;
$query = ("select date_add (current_date(), interval ".calcInterval($leverTijd)." days );");
14 regels ;)

Sundown Circus


Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP:
1
$i < ($leverTijd+1)


Mag ook zijn

PHP:
1
$i <= $leverTijd

[ Voor 14% gewijzigd door PrisonerOfPain op 03-10-2003 17:42 ]


Acties:
  • 0 Henk 'm!

  • aardbeix15
  • Registratie: Maart 2001
  • Niet online

aardbeix15

100%fruit pers je er niet uit!

er zijn ook gewoon goede kalenders beschikbaar, althans op mijn werk, waar je in een tabel kan checken of een dag voldoet aan de staat 'werkdag'.

Geen universele functie dus maar wel erg praktisch.

snel zeggen: 'De koetsier poetst de postkoets met postkoetspoets'
levensmotto: 'vroeg gedaan is lang gerelaxed!'.


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
aardbeix15 schreef op 03 October 2003 @ 20:57:
er zijn ook gewoon goede kalenders beschikbaar, althans op mijn werk, waar je in een tabel kan checken of een dag voldoet aan de staat 'werkdag'.

Geen universele functie dus maar wel erg praktisch.
Uhmm... waarom zou je een lookup doen in een kalender als je ook kan rekenen met data :?

RedRose:
Ik snap inderdaad je functie, maar het is volgens mij niet echt practisch voor mij, aangezien ik al een startdatum heb, én een einddatum, en vanaf de einddatum (bijvoorbeeld) 5 dagen terugmoet voor de uiteindelijke eindtijd voor de repro afdeling zelf.
Ik ga d'r maandag wel weer ff aan verder knutselen. thx voor de tip iig :)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Misschien een hele domme opmerking... ;) maar als je een levertijd van vijf werkdagen hebt zit er toch altijd een weekend in??? (ervan uitgaande dat je je orders niet in het weekend invoert kun je gewoon 7 dagen erbij optellen om te weten wanneer het klaar moet zijn :? )

[ Voor 37% gewijzigd door beetle71 op 04-10-2003 15:05 ]


Acties:
  • 0 Henk 'm!

  • bRight
  • Registratie: Juli 2000
  • Laatst online: 27-11-2024

bRight

digitaal

inderdaad :D

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
beetle71 schreef op 04 October 2003 @ 15:03:
Misschien een hele domme opmerking... ;) maar als je een levertijd van vijf werkdagen hebt zit er toch altijd een weekend in??? (ervan uitgaande dat je je orders niet in het weekend invoert kun je gewoon 7 dagen erbij optellen om te weten wanneer het klaar moet zijn :? )
Zoals ik zei: Dat kan dus variabel zijn. Als de levertijd 4 werkdagen is heb je een probleem :P

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

Verwijderd

beetle71 schreef op 04 October 2003 @ 15:03:
Misschien een hele domme opmerking... ;) maar als je een levertijd van vijf werkdagen hebt zit er toch altijd een weekend in??? (ervan uitgaande dat je je orders niet in het weekend invoert kun je gewoon 7 dagen erbij optellen om te weten wanneer het klaar moet zijn :? )
Dat is als je standaard 5 werkdagen levertijd hebt.
Maar je geeft in ieder geval aan dat een levertijd van 5 werkdagen effectief inhoudt dat het een week duurt voordat er iets geleverd wordt. Ik zou dus het aantal werkdagen levertijd delen door 5, en dat vermenigvuldigen met 7. Dat is de tijd die het minimaal gaat duren. Dat is het eenvoudige deel

Vervolgens neem je het aantal werkdagen modulo 5, en bepaal je aan de hand van de dag van de week of er nog een weekend bij moet.

Een handige mysql functie is WEEKDAY. Deze geeft 0 voor maandag, 1 voor dinsdag, en 6 voor zondag. Een dagnummer groter dan 4 geeft dus aan dat het weekend is, dus als de huidige dag plus de modulo aantal werkdagen groter dan 4 is, dan moeten er nog 2 dagen worden opgeteld bij het totaal.

Misschien zegt een MySQL query toch meer...

dagen = aantal werkdaten levertijd
datum = huidige datum

SQL:
1
SELECT FLOOR (dagen / 5 ) * 7 + dagen % 5 + IF(WEEKDAY(datum) + dagen % 5 > 4, 2, 0);

Dit levert dus het werkelijke aantal dagen levertijd op.

[ Voor 3% gewijzigd door Verwijderd op 04-10-2003 15:37 ]


Acties:
  • 0 Henk 'm!

  • NH298
  • Registratie: November 2002
  • Laatst online: 10-10-2021
en als er feestdagen tussen zitten :P

System specs


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
Verwijderd schreef op 04 October 2003 @ 15:36:
[...]

SQL:
1
SELECT FLOOR (dagen / 5 ) * 7 + dagen % 5 + IF(WEEKDAY(datum) + dagen % 5 > 4, 2, 0);
Geniaal _o_ _o_

Ik wist niet eens dat je een if kon gebruiken in een sql query :D _o_

* SchizoDuckie gaat hier ff mee aan het werk maandag :Y) thx!

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
NH298 schreef op 04 October 2003 @ 15:36:
en als er feestdagen tussen zitten :P
Repro zorgt altijd dat lopende opdrachten voor een periode van feestdagen af zijn :P

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Zou je toch niet iets gaan maken waarmee je dat ook kunt handlen? Bijvoorbeeld een tabel met alle uitzonderingen. Dan kun je met je if statements en isnull kijken of er uitzonderingen zijn. Dat is natuurlijk nog veel leuker :P

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
djluc schreef op 04 oktober 2003 @ 16:10:
Zou je toch niet iets gaan maken waarmee je dat ook kunt handlen? Bijvoorbeeld een tabel met alle uitzonderingen. Dan kun je met je if statements en isnull kijken of er uitzonderingen zijn. Dat is natuurlijk nog veel leuker :P
dan wordt het eerder WHERE NOT IN denk ik :P
Misschien toch wel leuk om rekening mee te houden idd. dan zou het ook nog gelijk in m'n lokalenplanning (ander onderdeel van het Intranet) passen :Y)

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 18-09 16:51
Waarom met where not in, dat is toch als je een lijst meegeeft? Je kunt toch gewoon een left join doen, alles waar geen uitzondering voor is krijgt dan toch als uitzondering de waarde NULL..

Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12
* SchizoDuckie buigt wederom voor Cheetah. Code is ingebouwd en werkt :)
_o_

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Tsja, :'( :'(

bewijs van failure/nog niet helemaal perfect ;) ...

stel 6 lever(werk)dagen

ik bestel op donderdag 09-10-2003 (dag=3 want: maandag=0)
dan moet ik volgens de cheetahs 'algoritme' het aantal 'echte dagen' als volgt uitrekenen.
  • dus floor van (6/5)*7 = 8
  • tel daarbij op 6 module 5 = 1 dus nu hebben we 9.
  • als de weekdag van donderdag 09-10-2003 (=3) + 6 modulo 5 (=1) samen groter is als 4 dan moeten we er nog 2 bij optellen, maar dat hoeft nu dus niet (=samen 4 dus niet groter).
  • Resultaat leverdag=9 echte dagen na 09-10-2003
  • dus 9 dagen na donderdag 09-10-2003 is de leverdag. dat is dus zaterdag 18-10.. en dat is geen werkdag.
Ik heb al flink zitten denken hoe dit op te lossen, maar ik ben er nog niet uit..

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
je kunt toch gewoon de IF uitbreiden
als je in jouw voorbeeld die 9 neemt, dan kun icm de DATE_ADD() functie bepalen dat de weekdag een zaterdag is en dan met een IF constructie in dat geval er 2 dagen bij optellen en als het geen zaterdag is kijken (ook een een IF) of het misschien een zondag is en er dan 1 dag bij optellen
Pagina: 1