2017-10-12 3 views
-4

Bitte Entschuldigung für einen Mangel an versuchten Code.MySQL Query Datumsbereich - gemeinsame Perioden finden

Ich kann mich nicht darum kümmern - oder herausfinden, ob es machbar ist!

Ich habe eine Tabelle mit 'date slots' gefüllt, diese können von einer Person gebucht werden.

Die Zeitschlitze Tabelle sieht wie folgt aus:

ID | Price | Available_from | Available_ to  
------------------------------------ 
1 | 20.00 | 2017-10-01 | 2018-01-01 
2 | 20.00 | 2017-11-01 | 2017-12-07 
3 | 20.00 | 2017-10-31 | 2018-01-31 
4 | 20.00 | 2017-10-22 | 2017-11-21  
------------------------------------ 

In diesen Reihen gibt es ein gemeinsames Datum Bereich, in dem alle vier Ergebnisse verfügbar sind, 2017.11.01> 2017-11-21

Ich möchte meine Datenbank abfragen, um zu sehen, ob 1) es für jedes Ergebnis einen gemeinsamen Bereich gibt und 2) wenn ja, den Datumsbereich abruft.

Verzweifelt um Hilfe!

Danke

+0

Nun, wenn Sie nur Ihre eigenen Beispieldaten betrachten, sollte es ziemlich schnell offensichtlich werden, dass das gewünschte Ergebnis aus dem maximalen Available_from Datum und dem Minimum Available_ to date besteht. (Um diese zu bekommen, recherchiere "mysql groupwise maximum" für die Grundidee.) Natürlich wird es nicht so einfach sein, wenn es in den existierenden Intervallen "Löcher" geben könnte - aber dein Beispiel enthielt solche nicht ein Fall. Also, jetzt ist der nächste Schritt, darüber nachzudenken, was die "Randfälle" in dieser Situation sein werden und welche spezielle Behandlung sie benötigen könnten. – CBroe

+0

Schauen Sie sich http://salman-w.blogspot.ca/2012/06/sql-query-overlap- date-ranges.html an. Recherchieren Sie auch StackOverflow für SQL-Datumsbereich Kreuzung, finden Sie einige detaillierte Antworten. Ex https://stackoverflow.com/questions/4490553/detect-overlapping-date-ranges-from-the-same-table – Nic3500

+0

Dank @CBroe, es so ausgebreitet und hatte einige geistige Gesundheit hinzugefügt - ja, es scheint weit einfacher! Danke, ich werde das jetzt erkunden. – user3061608

Antwort

1

Ich denke, das funktionieren würde:

SELECT MAX(Available_from) as MatchFrom, 
     MIN(Available_to) as MatchTo 
FROM Temporary.test 
WHERE 
    (SELECT MAX(Available_from) FROM Temporary.test) 
    <=(SELECT MIN(Available_to) FROM Temporary.test) 

Es NULL zurück, wenn es kein Überlappungsbereich ist.