2017-01-03 13 views
0

これを行う方法があれば、私にお願いしたいと思います。私はそれがサイクルで行うことができることを知っていますが、より良い方法でなければならないような気がします。日付範囲から日付範囲に基づいて行数を確認する

事がある私は、そのユーザが2017年2月24日に2017年2月14日のように、彼が予約したい日付範囲をテーブルの休暇

id | date_from | date_to 
1 2017-02-16 2017-02-19 
2 2017-02-18 2017-02-21 
3 2017-02-12 2017-02-19 
4 2017-02-19 2017-02-21 

をピックアップしていると私は彼ができるかどうかを確認する必要があります同時に4人だけが同時に休暇を申請することができるので、依頼してください。

したがって、ユーザーが選択した範囲(たとえば、2017-02-14から2017-02-24)で4日以上の行があるかどうかを確認するクエリが必要です。

ご回答いただきありがとうございます。

あなたはどの のためにこれを行うことができます
+0

私たちは以下の回答よりも良いを行うことができると思うが、私は適切なCREATE INSERT文提供することは有用であろうと思うし、望ましい結果が実際にどのように見えるかの例です。 – Strawberry

答えて

1

:あなたは毎日指定して、範囲にこれを拡張することができ

select count(*) 
from vacation v 
where '2017-02-14' between date_from and date_to; 

select dte, count(v.id) 
from (select date('2017-02-14') as dte union all 
     select date('2017-02-15') as dte union all 
     select date('2017-02-16') as dte union all 
     select date('2017-02-17') as dte union all 
     select date('2017-02-18') as dte union all 
     . . . 

    ) d left join 
    vacation v 
    on d.dte between date_from and date_to 
group by d.dte 
having count(*) > 4; 

それは上をループする単純かもしれませんアプリケーション側。または、カレンダーテーブルがある場合はカレンダーテーブルを使用します。

+0

回答ありがとう、良いアイデア。しかし、あなたが正しいです、アプリケーション層は、これを処理するために適しているようです。 – Volt

0

その日付の範囲内のすべての行を選択し、その結果を数える:

SELECT count(*) FROM vacation WHERE :input_from BETWEEN date_from AND date_to OR :input_to BETWEEN date_from AND date_to 
+0

それは結果を与えません。たとえば、投稿に記載されているテストケースに適用すると、クエリにはID 1,2,4のみが使用されますが、すべてのIDが関係します。さらに、それはすべての日の交差点の合計を返しますが、私は特定の日ごとにチェック交差点が必要です... – Volt

+0

私は選択した開始時刻が現在の期間内にあるすべての休暇を返すように、終了時刻が現在の期間にあるときこの方法では、その範囲内のすべての休暇を取得する必要があります。 –

+0

はい、でも、その範囲で8つの休暇を取ることができますが、すべての日は無料です(3つ以下の休暇が含まれます)。 – Volt