2017-10-12 2 views
-4

Veuillez accepter mes excuses pour un manque de tentative de code.Période de requête MySQL - trouver des périodes communes

Je n'arrive pas à comprendre ce qui se passe - ou même à comprendre si c'est faisable!

J'ai une table remplie de 'date slots', ceux-ci peuvent être réservés par un particulier.

Le tableau des créneaux horaires ressemble à ceci:

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

Dans ces lignes, il y a une plage de dates commune où les quatre résultats sont disponibles, 01/11/2017> 2017-11-21

Je voudrais interroger ma base de données pour voir si 1) il y a une gamme commune pour chaque résultat et 2) s'il y a, obtenir la plage de dates.

Besoin d'aide?

Merci

+0

Eh bien, si vous regardez juste vos propres données d'exemple, il devrait devenir évident assez rapidement, que le résultat désiré se compose de la date Available_from maximum et de la disponibilité minimum à ce jour. (En ce qui concerne les obtenir, allez chercher "mysql groupwise maximum" pour l'idée de base.) Bien sûr, ce ne sera pas aussi simple que cela, s'il y a des "trous" dans les intervalles existants - mais votre exemple ne contient pas un cas. Alors maintenant, votre prochaine étape consiste à réfléchir à ce que seront les «cas limites» dans cette situation, et à quelle manipulation spécifique ils pourraient avoir besoin. – CBroe

+0

Regardez http://salman-w.blogspot.ca/2012/06/sql-query-overlapping-date-ranges.html. Aussi recherche StackOverflow pour l'intersection de la plage de dates sql, vous trouverez quelques réponses détaillées. Ex https://stackoverflow.com/questions/4490553/detect-overlapping-date-ranges-from-the-same-table – Nic3500

+0

Merci @CBroe, après l'avoir exposé comme ça et avait un peu de santé mentale - oui, il semble loin plus simple! Merci, je vais explorer cela maintenant. – user3061608

Répondre

1

je pense que cela fonctionnerait:

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) 

Il retournera NULL, s'il n'y a pas de chevauchement plage.