webForumDet fria alternativet

Funktion för övertid OB mm

PHP

13 svar · 831 visningar · startad av AG

Medlem sedan mars 20001 266 inlägg
Frågan#1

I min databas har jag starttid och sluttid sparat i formatet yyyy-mm-dd hh:mm:ss nu skulle jag tex genom att loopa ut tiden se vilken tid som är på helgdagar samt efter klockan 1800-0800. Vart börjar man ? :)

Tack!

Medlem sedan juni 2009920 inlägg
#2

Vad är det för typ av databas? MySQL?
Isåfall för du skriva en SQL-fråga som väljer ut alla poster där klockslaget är mellan 1800 och 0800.

Medlem sedan mars 20001 266 inlägg
#3

MySQL är det. Skulle dock hellre se en funktion då jag tex vill använda det på 18-08, lör, sön samt kanske även lägga in vissa speciella datum som tex midsommar, julafton osv.

Tack

Medlem sedan okt. 201187 inlägg
#4

Har du databasen på en egen server eller på ett webbhotell eller mera har du tillgång till att funktioner som mysql erbjuder ?
/Hasse.

Medlem sedan mars 20001 266 inlägg
#5

Egen VPS. Så det borde gå

Medlem sedan okt. 201187 inlägg
#6

Det går ju alltid att joina några frågor så fungerar din rutin på alla ställen utom crystone som inte tillåter ens querys!!!???!!!.
Som den genuina procedur addic som jag så är en funktion som reder ut vad som var och inte var OB under arbetstiden det jag skulle förlusta mig med:-). Är inte vissa dagar halvdagar och registrerar du startdaum och starttid och stopdatum och stopptid eller registrerar du start datum och start tid och endast stopptid eller antal jobbade timmar ?
Ach... jag ser att du hade med tidsformatet i första frågan. då är det bara halvdagarna som är frågan
/Hasse

Medlem sedan mars 20001 266 inlägg
#7

Finns två fält; Starttid och Sluttid båda i formatet yyyy-mm-dd hh:mm:ss tex starttid 2013-01-05 17:00:00 sluttid 2013-01-06 01:00:00 i koden räknar jag ut diffen i timmar (sparar även undan det) dvs 8.0. I fallet ovan är det dock OB för tiden mellan 18:00 och 01:00. Samtidigt som att hela lör och sön även dem är OB. Man behöver alltså bryta upp varje tidsintervall på ngt sätt.

OB:
18:00 tom 08:00
Alla lördagar och söndagar
Allmänna helgdagar ( kan jag hårdkoda in)

Tack

Medlem sedan okt. 201187 inlägg
#8

Hoppas att jag har fattat dig rätt nu.
Låt funktionen först reda ut om det är vardag och räkna ut tiden mellan 18:00 och sluttiden eller om det är helg räkna ut hela tiden.
Om du börjar en söndag kl 3 och slutar 11:00 på måndagen krävs det lite mer knep och knåp.

Medlem sedan mars 20001 266 inlägg
#9

Precis, skulle nästan behöva loopa varje minut känns det som (använder inga sekunder) och se vad de är. Känner att man behöver lite hjälp på traven. Söndagsexemplet kommer inträffa.

Andreas

Medlem sedan okt. 201187 inlägg
#10

Då behöver du reda ut om sluttiden är vardag eller helg och kanske börja räkna från 18 och till sluttiden förutsatt att sluttiden är mindre än midnatt , annars stoppar du vid midnatt. Sen om stopptiden är efter midnatt så räknar du fram till 8:00 förutsatt att stopptiden är en vardag annars räknar du tiden ut.
Nu blev det lite virrigt ,jag gör ett nytt försök om det blev obegripligt

Medlem sedan mars 20001 266 inlägg
#11

Sådär, nu har jag komponerat ihop något. På sikt tror jag att jag vill göra skillnad på olika sorters OB och får väl då spara undan allt i en array. Funktionen kommer sen returnera värdet $total_ob

För att spara prestanda kommer jag endast köra funktionen då datan sparas så att den lägger in OB direkt i DB. Vore dock tacksam om någon ändå skulle vilja optimera koden, i den mån det är möjligt.

<?php
date_default_timezone_set('Europe/Paris');
$start = '2013-01-02 12:00:00';
$end = '2013-01-06 13:00:00';

$holidays = array();
$holidays[] = "2013-01-01";
$holidays[] = "2013-01-06";
$holidays[] = "2013-03-29";
$holidays[] = "2013-03-30";
$holidays[] = "2013-03-31";
$holidays[] = "2013-04-01";
$holidays[] = "2013-05-01";
$holidays[] = "2013-05-09";
$holidays[] = "2013-05-19";
$holidays[] = "2013-06-06";
$holidays[] = "2013-06-21";
$holidays[] = "2013-06-22";
$holidays[] = "2013-11-02";
$holidays[] = "2013-12-24";
$holidays[] = "2013-12-25";
$holidays[] = "2013-12-26";
$holidays[] = "2013-12-31";

$new_date = $start;
while(strtotime($new_date) <= strtotime($end)){

	if(in_array(date('Y-m-d', strtotime($new_date)), $holidays)){
		echo 'Helgdag';
		$ob_hol += 1 / 60;
	}elseif(date('N', strtotime($new_date)) == 6){
		echo 'L&ouml;rdag - ';
		$ob_sat += 1 / 60;
	}elseif(date('N', strtotime($new_date)) == 7){
		echo 'S&ouml;ndag - ';
		$ob_sun += 1 / 60;
	}elseif(date('H', strtotime($new_date)) >= 18){
		echo 'OB-kv&auml;ll - ';
		$ob_evening += 1 / 60;
	}elseif(date('H', strtotime($new_date)) < 6){
		echo 'OB-morgon - ';
		$ob_morning += 1 / 60;
	}
	echo $new_date . "<br />";
	$new_date = date('Y-m-d H:i:s', strtotime($new_date . ' + 1 minute'));
}
$ob_total = $ob_hol + $ob_sat + $ob_sun + $ob_evening + $ob_morning;
?>
Storhelg-OB: <?php echo $ob_hol; ?><br />
L&ouml;rdag-OB: <?php echo $ob_sat; ?><br />
S&ouml;ndags-OB: <?php echo $ob_sun; ?><br />
OB-kv&auml;ll: <?php echo $ob_evening; ?><br />
OB-morgon: <?php echo $ob_morning; ?><p />
<strong>Totalt OB: <?php echo $ob_total; ?>
Medlem sedan okt. 201187 inlägg
#12

Jag trodde du skulle lägga koden som en funktion i databasen.
/Hasse

Medlem sedan mars 20001 266 inlägg
#13

Hmm, nej. Tänkte köra det som en funktion i PHP när den sparas. Men då borde ovan fungera?

Medlem sedan okt. 201187 inlägg
#14

Känns lite brutalt att snurra igenom minut för minut och skulle det vara det vara i ett system med flera användare så ligger det i farans riktning att det kommer en system ansvarige med uppkavlade skjortärmar och knutna nävar. Samma personer brukar även kasta skitiga blickar efter en när man lägger lagrade procedurer i databasen :-).
Jag skulle kanske dela upp dygnet i 8-18 18-24 00-8 och reda ut hur många minuter som finns i dom olika intervallen genom funktionen round(abs($to_time - $from_time) / 60,2)
Knycket det här på nätet

$to_time = strtotime("2008-12-13 10:42:00");
$from_time = strtotime("2008-12-13 10:21:00");
echo round(abs($to_time - $from_time) / 60,2). " minute";

273 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
133 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
120 ms — ändringar (db)