2016-08-26 5 views
0

私のデフォルトの利用可能な部屋(avaroom)は0です。私は開始日と終了日を選択したときにそれを利用可能かどうかチェックしたい。開始日と終了日の間に利用可能なすべての部屋をチェックする方法は?

私のSQLクエリは

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

結果はこのようになります。私はこのクエリ

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') 

結果は空になります使用

enter image description here

。それは本当です。私はすべての部屋が開始日と終了日の間にあるかどうかをチェックしているからです。私は変更

次のクエリは、日付26と終了日を開始するために27

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') 

出力は1行

Yes.itまだ右になります。 26日の部屋が利用可能であるため。再び

私は28部屋も右available.itされていないため、Yes.itはまだwork.iそれが空だと思う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') 

開始日26と終了日を確認してください。

今すぐ。私は再び変えようとします。開始日29および終了日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!それは結果を示さない。私は29日の部屋が利用可能だと思います。 1行が表示されます。右? 正しいクエリを取得するにはどうすればよいですか?

もう一度もう一度チェックしてください。開始日29と終了日31。それは2つの結果を表示することがあります。

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') 

ですが、結果は1つだけです。

どのようにすべてのテストに合格する正しいクエリを作成するには?

ありがとうございました。

+0

なぜカウント(*)= datediff( '2016-08-31'、 '2016-08-29') 'を追加していますか?これは、datediff()の結果が返された行の数と同じ場合にのみ機能します。例では、1日の範囲を照会して1行を返すときです。その部分を省略してみてください! – derelict

+0

@derelictはいbro。誰かが私に問題を解決するために与える。しかし、それは動作しません。私の要件のための新しいクエリのための任意のアイデア。ありがとう –

+0

@MinKoKo:あなたは出力として正確に何をしたいですか?選択された日付の間に利用可能な部屋の総数または選択された日付の間の日付を持つ利用可能な部屋の数? –

答えて

0

は、私はあなたがあなたの旅行を予約できるようにするには、開始と終了の間毎日ためavaroom> 0と行を必要とする

のために行っているものを参照してください。

試み:1のDATEDIFFため

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

我々は2利用可能日私たちは5利用可能日が

考慮期待し4のDateDiff関数のための を期待して、旅行は2016年9月1日に開始され、2016から09を終了-02 - datediffは1ですが、09-01と09-02にはavaroomが必要です.2日は2行を意味するため、count(*)はdateiff + 1にする必要があります。

注:あなたは出発日をチェックする必要がない場合は、この同じクエリを使用しますが、あなたは終了日が出発日前1日であると検索を確認するつもりです。出発日some-dateの代わりにmysqlのDATE_SUB('some-date',INTERVAL 1 DAY)でこれを行うことができます。

幸運!

+0

これは1件の結果を表示します。 (2016-08-26 '、'2016-08-27')を持つroomcalendarからselect * from '2016-08-26'と'2016-08-27 'とavaroom!= 0を選択します。 )+1が表示されます。 –

+0

@MinKoKo:27日に空室がありません: –

+0

@KrutiPatel出発日は部屋をチェックする必要がありますか? –

0

残念ですが、もう1つ問題があります。 存在しない日付の隙間を埋めるためにいくつかのカウンターを使用する必要があります。 このクエリはジョブを実行します。

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 
関連する問題