2016-03-31 13 views
3

Im bir toplantı salonu rezervasyon sistemi üzerinde çalışıyor ve bir oda kümesi süre içinde alınırsa ben sorun endam yaşıyorum, ben tarihler için geçerli biçimi kullanıyorum ve tip tabloda DATETIME için belirledik: YYYY-MM-DD HH:II:SSZaman çerçevesi içinde bir rezervasyon olup olmadığını nasıl kontrol edebilirim?

Bu benim şimdiki kodudur: sql sorgusunda bunu yapmanın bir yolu

//Function to check if a booking exists: 
function bookingExist($DateStart, $DateEnd, $RoomNo) { 
    global $DB; 

    $sql = "SELECT * FROM bookings WHERE date_start = :dateStart AND date_end = :dateEnd AND room_no = :roomNo"; 
    $Q = $DB->prepare($sql); 
    $Q->bindParam(':dateStart', $DateStart); 
    $Q->bindParam(':dateEnd', $DateEnd); 
    $Q->bindParam(':roomNo', $RoomNo); 
    $Q->execute(); 

    if ($Q->rowCount()) { 
     //A record exists... 
     return true; 
    } else { 
     //no record exists 
     return false; 
    } 
} 

var mı?

örnek: Room A, 2016-03-31 15:00:00 ve 2016-03-31 17:30:00 saatleri arasında rezerve edildi. Ardından, 2016-03-31 için oda A için yeni bir rezervasyon oluşturmaya çalışın 16 : 30: 00 - 2016-03-31 17:00:00 ve thsi bir kayıt olduğu için 1 kayıt döndürmelidir

+0

ve zaman A ile tarih ve zaman B. Eğer öyleyse Yeni zaman diliminizin başlangıcı veya bitişi A ve B arasındadır. SQL'de ihtiyacınız olan bu mu? – Renan

+0

@Renan burada bir örnektir: Oda A, 2016-03-31 15:00:00 ve 2016-03-31 17:30:00 arası Kullanıcı tarafından rezerve edildi, daha sonra 2016 için oda için yeni bir rezervasyon oluşturmaya çalışıyor -03-31 16:30:00 - 2016-03-31 17:00:00 ve thsi bir kayıt olduğu için 1 rekor getirmelidir –

+0

Güncellenmiş cevabımı görün. –

cevap

2
SELECT * 
FROM bookings 
WHERE 
    (
    :dateStart BETWEEN date_start AND date_end 
    OR :dateEnd BETWEEN date_start AND date_end 
    OR date_start BETWEEN :dateStart AND :dateEnd 
) 
    AND room_no = :roomNo 

Bu oda size verilen zaman içinde rezerve değilse sen, satırlar sıfır verecektir. Oda (örneğin kısa bir süre)

DÜZENLEME arasında kitap ise :dateStart BETWEEN date_start AND date_end zaten startTime rezervasyonu eğer, :dateEnd BETWEEN date_start AND date_end bitiş zamanı ve date_start BETWEEN :dateStart AND :dateEnd da önemlidir sonuncusu rezervasyonu, denetler onun olmadığını kontrol edecek kontrol edecek : YA süreleri ve hiçbir vE;)

EDIT2: başlangıç ​​ve bitiş zamanlarını hariç tutabilmek için BETWEEN anahtar kelimeyi genişletebilir ve ilişki sadece olabilir yapmak zorunda bir <: oda tarihinden itibaren alınır

SELECT * 
FROM bookings 
WHERE 
    (
    (date_start < :dateStart AND :dateStart < date_end) 
    OR (date_start < :dateEnd AND :dateEnd < date_end) 
    OR (:dateStart < date_start AND date_start < :dateEnd) 
) 
    AND room_no = :roomNo 
+0

alıntı edemedi: dateStart benim sütun adı veya gerçek tarih olmalı? –

+0

': dateStart',' $ DateStart' değişkeninizdir ve date_start' sütundur. Sorunuzda sadece aynı adı kullanıyorum. –

+0

Bugün rezervasyon 17: 00'de bitiyorsa ve 17: 00-18: 00 saatleri arasında toplantı yapmak istiyorum? –

0

sql sorgusunda BETWEEN kullanma hakkında ne düşünüyorsunuz? Denetlemekte olduğunuz tarih/saat parametrelerini ayarlamanız gerekir (bu, verilen örnekte ikinci kullanıcının istenen tarih/saatidir). dateEnd: - dateStart:

$firstDate = //start of time period you are checking; 
$lastDate = //end of time period you are checking; 
$Q->bindParam(':firstDate ', $firstDate); 
$Q->bindParam(':lastDate ', $lastDate); 

$sql = "SELECT * FROM bookings WHERE :date_start BETWEEN :firstDate AND :lastDate AND room_no = :roomNo"; 
+0

Bunun gibi: '' 'SELECT * FROM'DEN rezervasyonlarda NEREDE date_start ARAYIN: dateStart VE date_end ARASINDAKİ: dateEnd AND room_no =: roomNo" '' –

+0

Sorguyu çalıştırırken bir hata alıyorum: '' '1064 - SQL sözdiziminde bir hata; '14: 00: 00 AND 2016-03-31 17:00:00 yakınında kullanmak üzere doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin ve satır 1' '' numaralı odadan 1 LIMIT 0, 30 ' Sorgu: '' 'SELECT * REZERVASYON YAPIMI WHERE date_start BETWEEN 2016-03-31 14:00:00 VE 2016-03-31 17:00:00 AND room_no = 1''' –

+0

eksik gibi görünüyor date_start innt kolon - "tarih date_start" – gavgrif