Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Zeit abfrage? was wenn die zeit dazwischen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Zeit abfrage? was wenn die zeit dazwischen

    Hallo zusammen,

    für eine eingabe eines zeitfeldes über ein interface verwende ich ein formular, bei dem der user eine Zeit eintragen kann. z.b von 11:00 bis 12:00.

    Wie stelle ich es am besten an, wenn ein user eine überschneidende zeitangabe angibt z.B 10:00 bis 12:00 oder 09:00 bis 13:00 uhr? -> hier müsste es eine fehlermeldung geben, da es bereits einen eintrag von 11:00 bis 12:00 uhr gibt und dieses zeitfenster nicht mehr angewählt werden kann.

    ich habe es über eine query in der derart versucht:
    PHP-Code:
    public function timeSet$room$date$user_name$user_id$from_time$to_time){

                
    // check for date if exists
                
    $query_check_room_occupation $this->db_connection->prepare('SELECT room_name, reservation_date, from_time, to_time FROM roomreservation WHERE room_name=:room_name AND reservation_date=:reservation_date BETWEEN from_time=:from_time AND to_time=:to_time');
                
    $query_check_room_occupation->bindValue(':room_name'$roomPDO::PARAM_STR);
                
    $query_check_room_occupation->bindValue(':reservation_date'$datePDO::PARAM_STR);
                
    $query_check_room_occupation->bindValue(':from_time'$from_timePDO::PARAM_STR);
                
    $query_check_room_occupation->bindValue(':to_time'$to_timePDO::PARAM_STR);
                
    $query_check_room_occupation->execute();
                
    $result $query_check_room_occupation->fetchAll();
                 
                
    print_r($result);
                 
                if( 
    count($result) > ){
                    
                    if( 
    $result['from_time'] >= $from_time(input) && $result['to_time'] <= $to_time(input) ){
    echo 
    "<h1>überschneidung der zeiten</h1>";
    }
                           
                    
                }
                else{
                    echo 
    "do something else";
                }
             } 
        } 
    Bei einer überschneidung der zeitfenster liefert das array kein Ergebniss, was auch richtig ist - kann man die abfrage irgendwie invertieren zu sagen suche mir alle zeiten, die zwischen input_eingabe_from_time <= existierendes DatumDB und input_eingabe_to_time >= existierendes DatumDB liegen?

    oder wie mache ich die abfrage so, dass ich die input values mit den existierenden Feldern vergleichen kann?

    danke für euer hilfe

    ps: die selection der zeit ist abhängig vom $datum (01.12.2014) und $room (eine nummer)

  • #2
    Zitat von moloko Beitrag anzeigen
    Hallo zusammen,

    für eine eingabe eines zeitfeldes über ein interface verwende ich ein formular, bei dem der user eine Zeit eintragen kann. z.b von 11:00 bis 12:00.

    Wie stelle ich es am besten an, wenn ein user eine überschneidende zeitangabe angibt z.B 10:00 bis 12:00 oder 09:00 bis 13:00 uhr? -> hier müsste es eine fehlermeldung geben, da es bereits einen eintrag von 11:00 bis 12:00 uhr gibt und dieses zeitfenster nicht mehr angewählt werden kann.

    Dazu definierst Du ein Exclusion Constraint in der Datenbank, das geht so:

    Code:
    test=*# create table zeiten (id int, von_bis tsrange, exclude using gist(id with =, von_bis with &&));
    CREATE TABLE
    Time: 3,789 ms
    test=*# commit;
    COMMIT
    Nun kannst Du keine für ID-gleiche Datensätze sich überlappende Zeit-Ranges mehr eingeben:

    Code:
    test=# insert into zeiten values (1, '[2014-12-22 11:00:00, 2014-12-22 13:00:00)');
    INSERT 0 1
    Time: 0,514 ms
    test=*# insert into zeiten values (1, '[2014-12-22 10:00:00, 2014-12-22 12:00:00)');
    ERROR:  conflicting key value violates exclusion constraint "zeiten_id_von_bis_excl"
    DETAIL:  Key (id, von_bis)=(1, ["2014-12-22 10:00:00","2014-12-22 12:00:00")) conflicts with existing key (id, von_bis)=(1, ["2014-12-22 11:00:00","2014-12-22 13:00:00")).
    Time: 0,377 ms
    Die DB, die ja 'am nächsten' zu den Daten steht, überwacht nun Deinen Constraint.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Zitat von akretschmer Beitrag anzeigen

      Die DB, die ja 'am nächsten' zu den Daten steht, überwacht nun Deinen Constraint.
      Um den zweiten Teil Deiner Frage zu beantworten:

      Du hast:

      Code:
      test=*# select * from zimmer ;
       id
      ----
        1
        2
        3
      (3 rows)
      
      Time: 0,224 ms
      test=*# select * from zeiten ;
       id |                    von_bis
      ----+-----------------------------------------------
        1 | ["2014-12-22 10:00:00","2014-12-22 12:00:00")
      (1 row)
      und suchst nun wohl:

      Code:
      test=*# select * from zimmer where id not in (select zimmer.id from zimmer left join zeiten on zimmer.id=zeiten.id where zeiten.von_bis  && '[2014-12-22 11:00:00,2014-12-22 13:00:00)');
       id
      ----
        2
        3
      (2 rows)
      Also: die Zimmer 2 und 3 wären im Zeitraum '[2014-12-22 11:00:00,2014-12-22 13:00:00)') frei.
      PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

      Kommentar

      Lädt...
      X