2016-08-26 1 views
0

Mein standardmäßig verfügbarer Raum (Avaroom) ist 0. Ich möchte es prüfen, ob es verfügbar ist oder nicht, wenn wir das Startdatum und das Enddatum auswählen. Wie überprüft man alle verfügbaren Zimmer zwischen Anfangs- und Enddatum?

meine SQL-Abfrage

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-31' and avaroom != 0 

Das Ergebnis wird so sein.

enter image description here

Ich benutze diese Abfrage

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-31' and avaroom != 0 
having count(*) = datediff('2016-08-31', '2016-08-26') 

Ergebnis leer. es ist wahr. weil ich zwischen Anfangs- und Enddatum überprüfe, ob alle Zimmer verfügbar sind oder nicht.

Nächste Abfrage ich ändern 27 Datum 26 und Enddatum

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-27' and avaroom != 0 
having count(*) = datediff('2016-08-27','2016-08-26') 

Ausgang beginnen 1 Reihe

Yes.it noch richtig sein. weil 26 Tage Zimmer zur Verfügung stehen.

erneut prüfen i Startdatum 26 und Enddatum 28.

select * 
from roomcalendar 
where day between '2016-08-26' and '2016-08-28' and avaroom != 0 
having count(*) = datediff('2016-08-28','2016-08-26') 

Yes.it es noch work.i denken leer, weil 28 Zimmer sind auch nicht richtig available.It.

Jetzt. Ich versuche, mich noch einmal zu ändern. Anfangsdatum 29 und Enddatum 30

select * 
from roomcalendar 
where day between '2016-08-29' and '2016-08-30' and avaroom != 0 
having count(*) = datediff('2016-08-30', '2016-08-29') 

Opps! Es zeigt kein Ergebnis. Ich denke 29 Zimmer sind verfügbar. Es wird die 1 Zeile angezeigt. Recht? So, wie Sie die richtige Abfrage erhalten?

erneut eine Überprüfung. Startdatum 29 und Enddatum 31. Mai, es wird Show 2 Ergebnis sein.

select * 
from roomcalendar 
where day between '2016-08-29' and '2016-08-31' and avaroom != 0 
having count(*) = datediff('2016-08-31','2016-08-29') 

aber es zeigt nur ein Ergebnis.

Wie mache ich die richtige Abfrage, um alle Tests zu bestehen?

Danke.

+0

warum fügen Sie 'mit count (*) = datediff ('2016-08-31', '2016-08-29')'? Dies funktioniert nur, wenn das Ergebnis von datediff() mit der Anzahl der zurückgegebenen Zeilen übereinstimmt - in Ihrem Beispiel, wenn Sie einen einzelnen Tagesbereich abfragen und eine einzelne Zeile zurückgeben. versuchen Sie, den gesamten Teil der Abfrage wegzulassen! – derelict

+0

@derelict ja bro. Jemand gibt mir das Problem zu lösen. Aber es funktioniert nicht. irgendeine Idee für neue Abfrage für meine Anforderung. Danke –

+0

@MinKoKo: was genau willst du als Ausgang? Gesamtanzahl der verfügbaren Zimmer zwischen ausgewählten Daten oder verfügbare Anzahl von Zimmern mit Daten zwischen ausgewählten Daten? –

Antwort

0

ich sehe, was Sie für

gehen müssen Sie eine Reihe mit avaroom> 0 für jeden Tag zwischen Anfang und Ende der Lage sein, eine Reise zu buchen.

Versuch:

having count(*) = datediff('start-date','end-date')+1 

für datediff von 1 erwarten wir 2 Tage verfügbar für datediff von 4 erwarten wir 5 Tage zur Verfügung

betrachten, Reise beginnt und endet 2016.09.01 2016-09 -02 - datediff ist 1, aber wir brauchen avaroom für 09-01 und 09-02, 2 Tage bedeutet 2 Zeilen, so count (*) sollte datediff + 1 sein.

Anmerkung:, wenn Sie benötigen Abreisedatum nicht zu überprüfen, Sie gehen diese gleiche Abfrage verwenden wollen, aber stellen Sie sicher, dass Sie mit dem Enddatum suchen sein einen Tag vor Abreisedatum. Sie können dies mit mysqls DATE_SUB('some-date',INTERVAL 1 DAY) anstelle des Abflugdatums some-date tun.

viel Glück!

+0

wird 1 Ergebnis angezeigt. Wählen Sie * aus dem Raumkalender aus, wobei der Tag zwischen '2016-08-26' und '2016-08-27' und awaroom! = 0 mit Anzahl (*) = datediff ('2016-08-26', '2016-08-27') +1 aber es zeigt leer. –

+0

@MinKoKo: Da am 27. kein Zimmer frei ist :) –

+0

@KrutiPatel Abfahrtsdatum muss vorhandenes Zimmer prüfen oder nicht? –

0

Verfall hat es richtig, aber es gibt noch ein Problem. Sie müssen einen Zähler verwenden, um die Lücken von nicht vorhandenen Daten zu füllen. Diese Abfrage wird die Aufgabe erledigen.

select *,IF(avaroom != 0,1,0) a from roomcalendar where day between '2016-08-29' and '2016-08-30' GROUP BY a having sum(a) = datediff('2016-08-30','2016-08-29')+1 
Verwandte Themen