Mysql Abfrage für einen Kalender

Cannon

Grünschnabel
Guten Tag,

ich bin grad dabei zu versuchen einen Kalender zu Programmieren, nun brauch ich mal etwas hilfe. Und zwa speicher ich die start und endzeit des Termines als timestamp in eine mysql datenbank nun möchte ich prüfen ob bereits ein Termin für den Zeitraum angelegt ist bevor ich ein neuen Termin anlege allerdings fällt mir die nötige Mysql Select abfrage nicht ein. Könnt ihr mir helfen?

Noch ein kleines Beispiel:

zb ist bereits ein Termin eingetragen von 18 - 20 Uhr nun möchte ich einen neuen Termin anlegen von 18:45 - 21 Uhr und der Mysql select befehlt soll eben erkennen das die 2 Termine in der Selben Zeit statfinden und dann eben einen fehler ausgeben die Uhrzeiten sind als Timestamp gespeichert mit starttermin und endetermin
 
Zuletzt bearbeitet:
Mal eine Theoretische Frage: kann ein Termin z.B. 30 Minuten lang gehen, und ein anderer nur 15 Minuten?
Wenn ja, gibt es drei Möglichkeiten:

1) Der Termin (15min) liegt genau in dem Termin (30min)
2) Der Termin (15min) fängt in dem Termin (30min) an, hört aber danach auf
3) Der Termin (15min) fängt vor dem Termin (30min) an, hört aber in dem Termin auf

Entsprechend müsstest du drei Abfragen dazu gestalten:

1)
PHP:
SELECT *
   FROM kalender
   WHERE startzeit<='".$startzeit."'
   AND endzeit>='".$endzeit."'

2)
PHP:
SELECT *
   FROM kalender
   WHERE startzeit>='".$startzeit."'
   AND endzeit>='".$endzeit."'

3)
PHP:
SELECT *
   FROM kalender
   WHERE startzeit<='".$startzeit."'
   AND endzeit<='".$endzeit."'

irgendwie kann man die Abfragen sicher verbinden, mit UNION wenn ich mich nicht irre.

€: Oder man macht es noch einfacher, wie mir gerade einfällt:
PHP:
SELECT *
   FROM kalender
   WHERE (startzeit<='".$startzeit."' AND endzeit<='".$endzeit."')
   OR (startzeit>='".$startzeit."' AND endzeit<='".$endzeit."')
   OR (startzeit>='".$startzeit."' AND endzeit>='".$endzeit."')

Du kannst dann einfach die php-Funktion "mysql_num_rows" benutzen. Wenn die Funktion 0 zurückgibt, ist kein Termin in diesem Zeitraum geplant.

Gruß
 
Zuletzt bearbeitet:
Du könntest natürlich auch BETWEEN benutzen:

Code:
SELECT COUNT(*) FROM `kalender` WHERE '$startzeit' BETWEEN `startzeit` AND `endzeit` OR '$endzeit' BETWEEN `startzeit` AND `endzeit`

Wenn da ein Wert > 0 zurück kommt, existiert bereits ein Termin für den Zeitraum.
 
scheint irgend wo ein fehler zu sein er gibt jedesmal eingetragen aus auch wenn in dieser zeit bereits ein termin eingetragen ist
hier der code:
Code:
$select = mysql_query("SELECT id FROM Sendeplan WHERE start BETWEEN ".$_POST[start]." AND ".$_POST[ende]." OR ende BETWEEN ".$_POST[start]." AND ".$_POST[ende].";");
	if(@mysql_num_rows($select) == 0)
	{
		mysql_query("INSERT INTO Sendeplan (start, ende, rj, sendung) VALUES ('".$_POST[start]."', '".$_POST[ende]."', '".$_POST[rj]."', '".$_POST[sendung]."');");
		echo "eingetragen";
	}
	else
	{
		echo "vergeben";
	}
und beim Beispiel von Lime sagt er immer vergeben
 
Zuletzt bearbeitet:
Ich glaube, du hast gerade das Statement falsch herum geschrieben, sicher bin ich mir aber nicht... wieder so ein Logik******

PHP:
start BETWEEN ".$_POST[start]." AND ".$_POST[ende]."
es sollte glaub ich
PHP:
".$_POST[start]." BETWEEN start AND ende
heißen

Du wandelst aber hoffentlich den $_POST[start]/$_POST[ende] erst in einen timestamp um...
 
Ich glaube, du hast gerade das Statement falsch herum geschrieben, sicher bin ich mir aber nicht... wieder so ein Logik******

PHP:
start BETWEEN ".$_POST[start]." AND ".$_POST[ende]."
es sollte glaub ich
PHP:
".$_POST[start]." BETWEEN start AND ende
heißen
So wie er es geschrieben hat sollte das schon passen mMn.

Versuch es mal bitte damit:
PHP:
if ( isset(
    $_POST['start'],
    $_POST['ende'],
    $_POST['rj'],
    $_POST['sendung']
) ) {
    $start   = mysql_real_escape_string( $_POST['start']   );
    $ende    = mysql_real_escape_string( $_POST['ende']    );
    $rj      = mysql_real_escape_string( $_POST['rj']      );
    $sendung = mysql_real_escape_string( $_POST['sendung'] );

    $query = mysql_query(
        "SELECT COUNT(id) FROM Sendeplan WHERE start BETWEEN ".
        "$start AND $ende OR ende BETWEEN $start AND $ende"
    ) or die ( mysql_error() );
    $query = mysql_fetch_array( $query, MYSQL_NUM );

    if( $query[0] == 0 ) {
        mysql_query(
            "INSERT INTO Sendeplan (start, ende, rj, sendung) ".
            "VALUES ($start, $ende, '$rj', '$sendung')"
        ) or die ( mysql_error() );
        echo 'eingetragen';
    } else {
        echo 'vergeben';
    }
}

Btw, sind die Felder `start` und `ende` vom Typ TIMESTAMP oder INT mit einem Unix-Timestamp?

Gruß
 
danke habs nun das erste ging doch nur hat javascript mir einen zu großen timestamp gegegeben hab ihn erst duch 1000 teilen müssen da der wert sonst zu groß wa für die Datenban danke nochmal
 
Zurück