03. februar 2007 - 22:57Der er
22 kommentarer og 1 løsning
Arbejdsdage mellem 2 datoer
Jeg skal have hjælp til at lave en funktion, der returnere antal arbejdsdage imellem 2 datoer. Jeg har siddet og kæmpet med den i noget tid nu, og troede den var der, men så begynder unix tidsangivelserne sgu er springe 1 time, uden at jeg lige kan se hvorfor.
Nå, men jeg skal have returneret antal arbejdsdage imellem 2 datoer, d.v.s at den skal tage højde for weekender, helligdage og ferie. Det sidste venter jeg med, til de 2 første virker som de skal, så bare spring over dem indtil videre.
Funktionen skal håndtere en deadlinedato og en udførselsdato, og der skal returneres enten 0, et negativt eller positivt antal arbejdsdage. Datoer kommer som yyyy-mm-dd. Helligdagene kan hardkodes ind.
jahh, ved det ikkel lige! Og ovenstående link vil jo heller ikke virke for forskellige år....... Du kan bruge strtotime() $unixdeadline = strtotime($deadline); $unixudfort = strtotime($udfort);
Henter du fra DB? Så kan DATEDIFF bruges til at finde antal dage:
$days = mysql_query("SELECT DATEDIFF(`slut`, `start`) FROM `tabel` LIMIT 1") or die (mysql_error()); $antaldage = mysql_result($days, 0);
Har brugt DATEDIFF, skippede den da den jo ikke tager højde for weekender, helligdage og ferier, måske skal jeg indføre den igen, som terminator i forløkken.
Jeg har udregnet helligdagene, og når udførselsesdatoen ligger før deadline, så springer den også over på weekender og helligdage, det gniber dog noget når deadline er overskredet.
//Mangler stadig datoerne som er indtastet som feriedage
//Er det én af de faste helligdage if ( $tempdato == $paaskedag_to || $tempdato == $skartorsdag || $tempdato == $langfredag || $tempdato == $kristi || $tempdato == $pinsedag_to || $tempdato == $bededag){ $fridage = $fridage+1; }
//Er det en weekend if (date("w", $tempdato) == 0 || date("w", $tempdato) == 6) { $fridage = $fridage+1; } } $forskel = $antaldage + $fridage;
Den ser ud til at returnere de korrekte antal arbejdsdage, tror lige jeg holder lidt øje den.
Lader derfor spørgsmålet stå åbent lidt endnu, og hvis du showsource, kan optimere koden, må du meget gerne det. Jeg tænker her på, så jeg ikke behøves, at tjekke for om deadlines er overskredet eller ej, som jeg gør nu før jeg udregner selve forskellen.
Hmm, hvorfor virker min ikke hvis det er over flere år?
Og, ja, jeg ved det ikke er alle helligdage, som jeg har med, det skal også udvides, så feriedag (indtastet i admin-delen, og gemt i et array i en php-side) også undlades i den relle arbejdsdage optælling.
Jeg har lige hurtigt kigget på din kode, og hvad mener du lige med
// gider ikke lige tælle dage til jul, men et fast antal er der vel?
Du har jo 1. og 2. juledag...
Men jeg lige prøve om jeg ikke kan få kigget nærmere på det én af de først kommende dage.
Det er et salgs-/ordre system, hvor brugerne skal have en oversigt over alle ordre, der ar fået udskrevet en ordrebekræftelse inden for en bestemt periode.
En enkelt ordre har flere delpunkter den skal igennem, er der lavet statik, er den tegnet o.l. Alle disse delpunkter, har en deadline i forhold til ordrebekræftelsen, men da brugeren også skal udfylde hvornår det enkelte delpunkte er blevet udført, kan vi se, om det var før, efter eller på deadline dagen, at den f.eks. blev meldt klar til statik.
Tilbage til oversigten, jeg prøver lige at illustrerer den:
ordre = ordrenr. deadline = deadline for "Klar til statik" udført = dato for hvornår ordren er meldt "Klar til statik" forskel = forskellen i arbejdsdage på de 2 foregående datoer, skal både kune være negativt (deadline overskredet) og positivt (deadline holdt).
aha ! :O) Jeg er jo bare gået ud fra at det var +plusdage som var brugbar, selvom du skrev 0 og minusværdier.
Det med tid til jul, var fordi jeg i min tåbelighed troede der var fat antal dage til jul, men det er der selvf. ikke.
function work_days($start_dato, $slut_dato) {
$days = mysql_query("SELECT DATEDIFF('". $slut_dato ."', '". $start_dato ."')") or die (mysql_error()); $antaldage = mysql_result($days, 0); mysql_free_result($days);
if($antaldage <= 0) { return $antaldage; }
// Funktion til at putte vars i array'et med fridage. // funktion hvis nu det skal være for forskellige år
function make_array($myarray, $year) {
if(!is_array($myarray)) { return false; }else{
// gider ikke lige tælle dage til jul, men et fast antal er der vel? $myarray[] = strtotime($year ."-12-25"); $myarray[] = strtotime($year ."-12-26"); $myarray[] = (strtotime($year ."-12-31")+86400);
$paaskedag = easter_date($year); $fridage = array(3,2,1,26,39,50); // dage som skal trækkes fra/lægges til $paaskedag
// Funktion til at putte vars i array'et med fridage. // funktion hvis nu det skal være for forskellige år
function make_array($myarray, $year) {
if(!is_array($myarray)) { return false; }else{
// gider ikke lige tælle dage til jul, men et fast antal er der vel? $myarray[] = strtotime($year ."-12-25"); $myarray[] = strtotime($year ."-12-26"); $myarray[] = (strtotime($year ."-12-31")+86400);
$paaskedag = easter_date($year); $fridage = array(3,2,1,26,39,50); // dage som skal trækkes fra/lægges til $paaskedag
Fatal error: Cannot redeclare make_array() (previously declared in d:\www\test\kvalitet_process.php:119) in d:\www\test\kvalitet_process.php on line 119
Men du er stadig ikke kommet med en forklaring på hvorfor min kode, ikke skulle virke med flere forskellige år?
Jeg tror også lige jeg smider hele kode op, så du kan se hele sammenhængen.
if ($start == 1){ $kvarbe = "kvartalsregnskabet januar-marts i regnskabsåret"; $aar = $slutaar; } else if ($start == 4){ $kvarbe = "kvartalsregnskabet april-juni i regnskabsåret"; $aar = $slutaar; } else if ($start == 7){ $kvarbe = "kvartalsregnskabet juli-september i regnskabsåret"; $aar = $startaar; } else if ($start == 10){ $kvarbe = "kvartalsregnskabet oktober-december i regnskabsåret"; $aar = $startaar; } else { $kvarbe = "regnskabsåret"; }
}
$mis = "
SELECT o.ordre, MONTH(o5.r572a), YEAR(o5.r572a), r583, r527 AS id, r9 AS kunde, WEEK(r530c, 3) AS r530c, r530c AS deadline_r530c, WEEK(r542a, 3) AS r542a, r542a AS udfort_r542a, datediff(r530c, r542a) AS statik, WEEK(r577, 3) AS r577, r577 AS deadline_r577, r543a AS udfort_r543a, WEEK(r543a, 3) AS r543a, datediff(r577, r543a) AS optegning, WEEK(r532c, 3) AS r532c, WEEK(r547a, 3) AS r547a, datediff(r532c, r547a) AS prodtegn, WEEK(r544a, 3) AS r544a, datediff(r532c, r544a) AS kundegod, WEEK(r533d, 3) AS r533d, WEEK(r550a, 3) AS r550a, datediff(r533d, r550a) AS levering, r555 FROM (ordre AS o LEFT JOIN ordre0 AS o0 ON o.id = o0.tilbudsnummer) LEFT JOIN ordre5 AS o5 ON o0.tilbudsnummer = o5.tilbudsnummer WHERE MONTH(o5.r572a) >= '$start' && MONTH(o5.r572a) <= '$slut' && YEAR(o5.r572a) = '$aar' && o5.r575a != 1 ORDER BY ordre ASC ";
Jeg har selv løst det hele, ved at videre udbygge min kode
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.