2011-08-12 3 views
0

J'ai entrées dans ma table commesql laps de temps de mois

uid/start/end/value 

Je veux maintenant sélectionner toutes les entrées qui se trouvent dans un mois donné. Donc, si l'utilisateur choisit "Juin", je veux obtenir toutes les entrées qui sont disponibles en Juin. Le début et la fin sont sauvegardés en tant qu'horodatage (cela ne peut pas changer). J'ai trouvé quelque chose comme:

WHERE month(start)=5 

Cela ne fonctionne pas, mais malheureusement, il me donne seulement les entrées qui commencent en Juin. Je peux bien sûr ajouter la même chose pour la fin, mais cela n'aiderait pas si une entrée commence en mai et se termine en juillet. Je pourrais bien sûr calculer les horodatages et les comparer directement, mais je veux sélectionner ceci pour juin de n'importe quelle année - pas seulement un spécifique. Je pensais à quelque chose comme:

WHERE month(start) <= 5 && month(end) >= 5 

qui fonctionnerait très bien avec horodatages, mais il est évident que cela a un problème avec l'année pauses.

Existe-t-il une bonne solution pour ce faire sans calculer tous les horodatages des années suivantes et créer une grosse requête malade?

Répondre

0

Ok je compris cela:

WHERE month(start)=5 
OR month(end)=5 
OR (month(start)<=5 AND month(end) >= 5) 
OR (month(start)<=5 AND year(start)<year(end)) 
OR (month(end)>=5 AND year(start)<year(end)) 

Je pense qu'il est correct et fonctionne très bien.

0

On dirait que cela devrait fonctionner, mais c'est assez compliqué, et je suis assez sûr que l'utilisation de la fonction mois signifie que vous ne rencontrerez aucun indice.

Vous pouvez également reformulez comme:

where start <= 1 Jun 2011 
and end >= 1 Jul 2011 
+0

Oui la performance peut-être pas trop bien, mais il est assez rapide pour ce que je dois. Votre solution est pour le problème facile si je veux des entrées dans un laps de temps défini. Mais je veux toutes les entrées pour "jun 2011", "jun 2012", "jun 2013" etc. Mais je ne sais pas pour combien d'années. donc si je fais juste ceci, alors je reçois une requête vraiment énorme, parce que je dois vérifier toutes les années à l'avenir avec ces deux lignes pour chacune des années. – Flo

Questions connexes