2013-08-23 8 views
0

Je suis dans la situation où je veux correspondre à une plage de dates avec une autre plage de dates, il peut être simple mais je suis coincé dans ce domaine.Comment vérifier si la plage de dates sélectionnée se situe entre une plage de dates

structure de la table est ci-dessous

Tableau -

cycles de vie
  • life_id
  • life_start_date
  • life_end_date

puis quelques dossiers comme ci-dessous

1 - 07/23/2013 - 07/24/2013 
2 - 07/15/2013 - 07/25/2015 
3 - 03/10/2013 - 03/10/2014 

Maintenant, je veux rechercher ces enregistrements par plage de dates et je veux voir si une certaine vie existe dans cette gamme; par exemple. Je veux trouver la vie entre 08/01/2013 - 01/01/2014

Comme résultat escompté, il doit choisir la vie # 2 et # 3 vie

Comment cela peut-il être fait avec requête MySQL?

Toute aide est fortement appréciée.

+0

sont les dates étant stockées sous forme de '' varchar' ou Date'? – hjpotter92

+0

Vous trouverez réponse ici. http://stackoverflow.com/questions/18395738/find-instructor-free-times-in-mysql-ph/ – Arturs

+0

vie # 2 et # 3 la vie ne sont pas entre 08/01/2013 - 01/01/2014 .. .... (vie # 2 se termine en 2015!) – NDM

Répondre

2

Cette requête devrait le faire:

SELECT 
    * 
FROM 
    lifecycles 
WHERE 
    str_to_date(life_start_date, '%m/%d/%Y') <= '2014-01-01' 
    AND str_to_date(life_end_date, '%m/%d/%Y') >= '2013-08-01'; 

Ce qui signifie essentiellement la vie n'a pas commencé avant la fin de la plage que vous recherchez, et la vie n'a pas pris fin avant le début de la plage. Puisque vous gardez des dates au format VARCHAR, vous devez utiliser la fonction str_to_date, ce qui est mauvais car MySQL ne pourra pas utiliser les index possibles sur les colonnes start_date ou end_date.

+0

ne fonctionne pas! Comme j'ai besoin de trouver si la plage de dates interrogées est entre le life_start_date et le life_end_date – Alyas

+0

Que je ne suis pas sûr de comprendre ce que vous essayez. Cela vous donne # 2 et # 3 comme résultat, car ils sont en vie à un moment donné pendant le temps spécifié. – Zagor23

+0

A travaillé comme un charme maintenant! – Alyas

0

Vous voulez exclure natures mortes qui se sont terminées avant 08/01/2013 et ceux qui ne sont pas démarrés APRÈS 01/01/2014. Cela devrait fonctionner:

SELECT * 
    FROM lifecycles as alive 
WHERE NOT EXISTS (
     SELECT 1 
     FROM lifecycles as dead 
     WHERE dead.life_id = alive.life_id 
      AND (str_to_date(life_start_date, '%m/%d/%Y') > '2014-01-01' 
      OR str_to_date(life_end_date, '%m/%d/%Y') < '2013-08-01')) 
+0

Pourquoi feriez-vous une telle requête "compliquée" ... –

1

Ceci pourrait vous aider.

SELECT SUM(IF('2014-01-02' BETWEEN from_date AND to_date, 1, 0)) AS from_exist, 
     SUM(IF('2014-02-12' BETWEEN from_date AND to_date, 1, 0)) AS to_exist 
FROM date_range 

donc basée sur les résultats que vous pouvez vérifier si la date se situe entre la plage de dates existantes ou non.

Questions connexes