2017-01-03 2 views
0

Ich möchte Sie fragen, ob es in mysql eine Möglichkeit gibt, dies zu tun. Ich weiß, dass es mit dem Fahrrad gemacht werden kann, aber ich habe das Gefühl, dass es einen besseren Weg geben muss.Überprüfung der Zeilenanzahl basierend auf dem Datumsbereich im Datumsbereich

Ich habe Tisch Urlaub

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 

Die Sache ist, dass Benutzer den Datumsbereich nimmt er, wie 2017.02.14 zu 2017.02.24 reservieren will, und ich habe zu prüfen, ob er kann fordern Sie es noch, weil nur 4 Leute gleichzeitig Urlaub anfordern können.

Also brauche ich Abfrage, die prüfen wird, ob in benutzerdefinierten Bereich (zum Beispiel 2017-02-14 bis 2017-02-24) für jeden Tag 4 oder mehr Zeilen sind.

Vielen Dank im Voraus für Ihre Antworten.

+0

Ich denke, wir sind als die Antworten unten zur Verfügung gestellt besser machen können, aber ich denke, dass es nützlich wäre, die richtige zu bieten und CREATE-Anweisungen INSERT, und ein Beispiel dafür, wie ein gewünschtes Ergebnis tatsächlich aussehen könnte. – Strawberry

Antwort

1

Sie können dies tun, für jeden Tage:

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

Sie können diese erstrecken sich auf einen Bereich, durch jeden Tag festgelegt wird:

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; 

Es könnte eine Schleife auf der Durch einfacher sein Anwendungsseite. Oder, um eine Kalendertabelle zu verwenden, wenn Sie eine haben.

+0

Danke für die Antwort, gute Idee. Aber Sie haben Recht, die Anwendungsschicht scheint dafür besser geeignet zu sein. – Volt

0

Wählen Sie alle Zeilen in diesem Zeitraum und die Ergebnisse zählen:

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

Das wird das Ergebnis nicht geben. Wenn Sie zum Beispiel auf den im Post erwähnten Testfall angewendet werden, wird Ihre Abfrage nur die ID 1,2,4 annehmen, aber alle IDs sind beteiligt. Darüber hinaus wird es die Summe der Kreuzungen an allen Tagen zurückgeben, aber ich brauche den Schnittpunkt für jeden einzelnen Tag ... – Volt

+0

Ich habe gerade meine Abfrage geändert, so sollte es alle Urlaube zurückgeben, wo eine ausgewählte Startzeit in einer aktuellen Periode ist oder wenn die Endzeit in einer aktuellen Periode ist. Auf diese Weise sollten Sie alle Ferien in diesem Bereich bekommen. –

+0

Ja, aber Sie können immer noch 8 Ferien in diesem Bereich haben, aber alle Tage können frei sein (3 oder weniger Ferien enthalten), das ist das Problem. – Volt

Verwandte Themen