2014-07-19 7 views
0

J'essaie de savoir si une période est dans une période de temps. J'ai ma période de référence et ma période comparative. Permettez-moi un exemple:période de temps dans la période de temps (PHP)

  • Période A (référence) va de 1.1.2014 à 2.1.2014 (tt.mm.yyyy).
  • La période B (comparée) va du 1.4.2014 au 1.5.2014.

=> Ce serait totalement ok.

  • Période C (référence) va du 01.01.2014 au 1.3.2014
  • Durée période D (comparatif) va de 02.01.2014 à 01.05.2014.

=> Non ok parce que D est en C.

J'espère que vous obtenez ce que je veux. J'ai essayé de faire Serval < => si les actions, mais cela commence à devenir énorme et lent. Peut-être qu'il y a un moyen plus rapide de le faire.

De plus, MySQL est-il capable de faire de telles choses?

Répondre

0

vous pouvez essayer avec php timestamp

$reference_start_date = "1.1.2014"; 
$reference_end_date = "1.2.2014"; 

$comparative_start_date = "1.4.2014"; 
$comparative_end_date = "1.5.2014 "; 

$reference_start_time = strtotime(str_replace(".", "-", $reference_start_date); 
$reference_end_time = strtotime(str_replace(".", "-", $reference_end_date); 

$comparative_start_time = strtotime(str_replace(".", "-", $comparative_start_date); 
$comparative_end_time = strtotime(str_replace(".", "-", $comparative_end_date); 

if($comparative_start_time>$reference_start_time && $comparative_start_time<$reference_end_time) 
{ 
    echo "Not OK"; 
} 
else if($comparative_end_time>$reference_start_time && $comparative_end_time<$reference_end_time) 
{ 
    echo "Not OK"; 
} 
else if($comparative_start_time<$reference_start_time && $comparative_end_time>$reference_end_time) 
{ 
    echo "Not OK"; 
} 
else 
{ 
    echo "OK"; 
} 
+0

Essayé cela et semble bien fonctionner. Mieux que mon désordre d'if-else. Merci! – Jannik

0

vous pouvez faire comme ci-dessous:

Vérifiez Reference_start >= comparative_start && Reference_end < comparative_end Si cette condition devient vraie que votre temps sera chevauchée.

0

Si vous avez une période reference (ayant startDate et endDate) et vous avez une période comparative, alors vous pouvez avoir cette clause where dans MySQL:

where ((reference.startDate > comparative.endDate) or reference.endDate < comparative.startDate) 

qui serait vrai si les deux périodes ont pas intersection.

0

En supposant que vous avez vos dates donnent à UTC, il est très simple de comparer deux plages de dates. Il y a 5 cas spécifiques qui peuvent se produire:

11111...... 
......22222 

..11111..... 
.....22222.. 

...11111.... 
...22222.... 

.....11111.. 
..22222..... 

......11111 
22222...... 

Seuls le premier et le dernier sont ceux que vous recherchez. Il est facile de construire une requête if et de l'invalider:

if (!($dateRange1End <= $dateRangeStart2 && $dateRange2End <= $dateRange1Start)) 
    // NOT OKAY 
else 
    // OKAY 
Questions connexes