2010-12-02 33 views
1

J'ai plusieurs lignes dans une table, chacune contenant une date de début et une date de fin. L'utilisateur a une case à cocher pour chaque mois de l'année. J'ai besoin de déterminer quelles lignes contiennent une plage de dates qui inclut l'un des mois choisis par l'utilisateur.MySQL - Trouver les plages de dates correspondant à une liste de mois

Il est facile de vérifier le début & mois de fin, par exemple, MONTH(start_date) IN ($month_list), mais cette approche ne correspondra pas de mois entre les deux dates.

Donc je suppose que ce que je demande est: existe-t-il un moyen d'obtenir les mois inclusifs à partir d'une plage de dates purement en SQL?

Répondre

0

Quelque chose comme ça peut-il vous aider?

WHERE 
    MONTH(start_date) < MONTH_YOU_ARE_CHECKING and 
    MONTH() > MONTH_YOU_ARE_CHECKING 

Si vous devez vérifier à la fois que vous pouvez faire une liste de tous les mois et après suppression de la liste du mois que l'utilisateur de choisir, et après comparaison avec la liste. Ce sera mieux avec un exemple :) pseudocode

MONTHS = 1,2,3,4,5,6,7,8,9,10,11,12 
USER_SELECTED_MONTHS= 1,6,8,9,12 
LIST_TO CHECK = 2,3,4,5,7,10,11 

, vous pouvez maintenant faire:

MONTH(start_date) NOT IN (2,3,4,5,7,10,11) 

Que pensez-vous, pourrait-il vous aider?

ce qui a trait

0

Je suppose que vous voulez inclure les lignes de données où les portées de la plage de dates ou intersecte avec les périodes sélectionnées - dans ce cas, je serais bousculent l'utilisateur des périodes sélectionnées dans une table et faire une floue jointure , quelque chose comme .....

SELECT DISTINCT at.* 
FROM a_table at, user_periods up 
WHERE at.start_date<=up.end_date 
AND at.end_date>=up.start_date 
AND up.trans_id=$SOME_VAR 

(le trans_id permet simplement la table à utiliser pour de multiples opérations)

Afin de minimiser l'effort ici, la table user_periods devrait avoir un indice sur start_date et date_fin , et similaire pour a_ta ble.