Sehr komplexe Datumsabfrage!?

NeoNeMeSiS

Grünschnabel
In der folgenden Funktion soll anhand einer vorher vom Benutzer getroffenen groben Auswahl nach Anfangs-Monat/End-Monat und Jahr einer Reise sollen alle in der DB gespeicherten und auf diese Auswahl zutreffenden Ergebnisse ausgegeben werden jedoch funktioniert die Abfrage nicht und ich - habe die Aufgabe von meinem Vorgänger übernommen - komme nicht mehr weiter habe schon 8 Stunden nur über dieser Abfrage gegrübelt.

PHP:
/****************************************************/
function get_grob($reiseart,$termin_eins_grob,$termin_zwei_grob,$ort,$page=1,$jahr){

    if ($termin_eins_grob>$termin_zwei_grob)
		$jahr2=$jahr+1;
	else
		$jahr2=$jahr;

/****************************************************/

	if (strlen($termin_eins_grob)==1){
		$monat1="0$termin_eins_grob";
		echo($monat1);
	}
	else{
		$monat1=$termin_eins_grob;
		echo($monat1);
	}

/****************************************************/
	
	$datum1=$jahr."-".$monat1."-01";

	if (strlen($termin_zwei_grob)==1){
		$monat2="0$termin_zwei_grob";
		echo($monat2);
	}
	else{
		$monat2=$termin_zwei_grob;
		echo($monat2);
	}

/****************************************************/
	
	$datum2=$jahr2."-".$monat2."-31";
    //echo $datum1."<br>".$datum2."<br>";
	echo($jahr2);

    
/****************************************************/
	
       	$jahr2a = $jahr."-01-01";
        $jahr2e = $jahr."-12-31";

/* DIE ALTE VERSION DER ABFRAGE - UND DIE ZUR ZEIT VERWENDETE */

		$abfrage = "SELECT *  FROM travel_groups where ((termin_eins <= '$datum1' and termin_zwei >= '$datum1')or (termin_eins <= '$datum2' and termin_zwei >= '$datum2') or (termin_eins_grob <= '$termin_eins_grob' and termin_zwei_grob >= '$termin_eins_grob') or (termin_eins_grob <= '$termin_zwei_grob' and termin_zwei_grob >= '$termin_zwei_grob')) and art='$reiseart'";

/* DIE NICHT FUNKTIONIERENDE ABFRAGE */

		//$abfrage = "SELECT *  FROM travel_groups where ((termin_eins_grob <= '$termin_eins_grob' and termin_zwei_grob >= '$termin_eins_grob')or(termin_eins_grob <= '$termin_zwei_grob' and termin_zwei_grob >= '$termin_zwei_grob')) and ((termin_eins >= '$jahr2a' and  termin_eins >= '$jahr2e') or (termin_zwei <= '$jahr2a' and termin_zwei <= '$jahr2e')) and  art = '$reiseart'";

        $this->all_travels=mysql_query($abfrage,$this->verbindung);

	$this->howmany_travels=mysql_num_rows($this->all_travels);
	$this->max_pages=round($this->howmany_travels/$this->dps,0);
	if(($this->howmany_travels>$this->max_pages*$this->dps) && ($this->howmany_travels % ($this->max_pages*$this->dps)>0))$this->max_pages++;


	$this->page=$page; 
}

Ich wäre für jede Idee sehr dankbar...
 
würde da nich soviel rumrechnen in php
vielleicht schaust du dir mal die datumsfunktionen von mysql an...sollte einfacher gehen
 
Danke diese Abfrage habe ich gelöst doch nun habe ich bei einer anderen ein Problem :

PHP:
function get_fein($reiseart,$termin_eins,$termin_zwei,$ort,$page=1) {
	
	$kurz1=explode(".", $termin_eins);
	$kurz1=$kurz1[1];
	//echo("kurz1: ". $kurz1 ."<br>");							// gibt den Anfangsmonat aus

	$kurz2=explode(".", $termin_zwei);
	$kurz2=$kurz2[1];
	//echo("kurz2: ". $kurz2 ."<br>");							// gibt den Endmonat aus

	$temp1=explode(".", $termin_eins);
	//echo($temp1[0]." ".$temp1[1]." ".$temp1[2]."<br>");		// gibt TAG, MONAT, JAHR aus
	
	$termin_eins=$temp1[2]."-".$temp1[1]."-".$temp1[0];
	//echo("termin_eins". $termin_eins ."<br>");

	$temp2=explode(".", $termin_zwei);
	//echo($temp2[0]." ".$temp2[1]." ".$temp2[2]);				// gibt TAG, MONAT, JAHR aus
	
	$termin_zwei=$temp2[2]."-".$temp2[1]."-".$temp2[0];
	
	//echo("termin_zwei". $termin_zwei ."<br>");
	echo $termin_eins."<-->".$termin_zwei."<br>";
	
	echo("TAG 1: ".$temp1[0]);
	echo("TAG 2: ".$temp2[0]);

/* 3. Versuch von Hermann (1. Idee >= 4. Idee von get_grob()) */


// ((termin_eins <= '$termin_eins' and termin_zwei >= '$termin_eins')or (termin_eins <= '$termin_zwei' and termin_zwei >= '$termin_zwei'))

		$abfrage = "select * from travel_groups where
		(
			(
				(
					(DAYOFMONTH(MONTH(termin_eins)) <= '$temp1[0]' and DAYOFMONTH(MONTH(termin_zwei)) >= '$temp1[0]') 
				or (DAYOFMONTH(MONTH(termin_eins)) <= '$temp2[0]' and DAYOFMONTH(MONTH(termin_zwei)) >= '$temp2[0]')
				)
				and
				(
					(MONTH(termin_eins) <= '$kurz1' and MONTH(termin_zwei) >= '$kurz1') 
				or (MONTH(termin_eins) <= '$kurz2' and MONTH(termin_zwei) >= '$kurz2')
				)
			)
			and  art like '$reiseart'
		)";		

/* 2. Versuch von Martin */

		//$abfrage = "SELECT *  FROM travel_groups where ((termin_eins <= '$termin_eins' and termin_zwei >= '$termin_eins')or (termin_eins <= '$termin_zwei' and termin_zwei >= '$termin_zwei') or (termin_eins <= '$kurz1' and termin_zwei >= '$kurz1') or (termin_eins <= '$kurz2' and termin_zwei >= '$kurz2')) and art='$reiseart'";

/* 1. Versuch von Martin */
		
		//$abfrage = "SELECT *  FROM travel_groups where ((termin_eins <= '$datum1' and termin_zwei >= '$datum1')or (termin_eins <= '$datum2' and termin_zwei >= '$datum2') or (termin_eins_grob <= '$termin_eins_grob' and termin_zwei_grob >= '$termin_eins_grob') or (termin_eins_grob <= '$termin_zwei_grob' and termin_zwei_grob >= '$termin_zwei_grob')) and art='$reiseart'";

	$this->all_travels=mysql_query($abfrage,$this->verbindung);
	$this->howmany_travels=mysql_num_rows($this->all_travels);
	$this->max_pages=round($this->howmany_travels/$this->dps,0);
	if(($this->howmany_travels>$this->max_pages*$this->dps) && ($this->howmany_travels % ($this->max_pages*$this->dps)>0))$this->max_pages++;
	
	$this->page=$page;
}

eigentlich soll anhand eines eingetippten Anfangsdatums von dem der Tag der in temp1[0] und des eingetippten Enddatums dessen Tag in temp2[0] gespeichert ist und der Monat der im Anfangsdatum, sowie der Monat der im Enddatum steht, eine Anfrage bewirken die nur Reisen anzeigt, die auch mit dem jeweiligen Datum das in der DB steht übereinstimmt anzeigen.

P.S.: Ich weiß keine sehr gelungene Aufgabenstellung aber etwas genaueres ist mir bei dieser Aufgabe nicht in den Sinn gekommen.
 
Also... ich hab mir jetzt nicht den ganzen Code angetan aber es erinnert mich doch sehr an einen Codetotschläger den ich erst vor kurzem gesehen habe.. der zwar funktioniert hat.. aber einfach öhm.. überflüssig war..

warum bestimmst du nicht vom Anfangsdatum und vom Enddatum den Unix-Timestamp und ließt dann alle Termine aus der DB aus deren Unixtimestamp zwischendrin liegen!

btw.: hab ich deine Aufgabenstellung überhaupt richtig verstanden? :suspekt:

MfG Dominik
 
Zurück