2010-12-09 8 views
1

J'utilise Doctrine pour l'ORM de mon application. Dans un tableau, j'ai un 'start_date'.PHP ou SQL calculer 3 jours ouvrables avant une date

en php, je peux calculer 3 jours avant une date:

date('l jS F (Y-m-d)', strtotime('-3 days')); 

Mais ce week-end comprend, je voudrais inclure seulement jours ouvrables.

I.e. Si un événement était un mercredi, j'obtiendrais un courriel de rappel le dimanche. Je préférerais recevoir l'e-mail de rappel un vendredi. Alors, comment pourrais-je calculer pour n'utiliser que du lundi au vendredi pour calculer? Si vous savez aussi comment le faire dans Oracle, ce serait génial.

Je préférerais l'avoir en php, donc je ne mais il ne serait pas obligé d'utiliser une fonction d'oracle personnalisé (au cas où je veux changer le moteur de base de données) utile de savoir dans l'oracle trop :-)

Merci les gars.

Répondre

5

PHP 5.3 prend en charge relative dates like weekdays, par ex.

echo date('Y-m-d', strtotime('-3 weekdays', strtotime('2010-12-08'))); 

produira 2010-12-03 (vendredi) par opposition à

echo date('Y-m-d', strtotime('-3 days', strtotime('2010-12-08'))); 

qui produira 2010-12-05 (dimanche)

Tous les formats pris en charge par strtotime sont également pris en charge dans le DateTime API.

Autant que je sache, il prend un peu de gymnastique pour faire ce calcul à partir d'Oracle

+1

Merci beaucoup: D Parfait. – Flukey

+1

J'ai appris quelque chose aujourd'hui. Merci! – jsuggs

1

date ('w') vous donne une représentation numérique du jour de la semaine. 0 (dimanche) à 6 (samedi) vous pouvez simplement vérifier si votre date est 0 ou 6 et soustraire 2 (ou un) jours supplémentaires.

 
$n = 3 
$timestamp = strtotime("-$n days") 
$day = date('w', $timestamp); 
if ($day == 0) { 
    $n = $n - 2; 
} else if ($day == 6) { 
    $n = $n - 1; 
} 

$timestamp = strtotime("-$n days") 

$dateString = date('l jS F (Y-m-d)', $timestamp); 

Désolé, je ne connais aucun code spécifique à Oracle.

+0

Oh, j'ai mal lu votre message - je pensais avec "Je préférerais recevoir l'e-mail de rappel un vendredi à la place." vous vouliez dire que dans les deux cas (dimanche et samedi) le rappel devrait être envoyé le vendredi. Pour seulement 3 jours de la semaine, le chemin de Gordon est nettement meilleur. – sirion

+0

Pas de soucis. Merci tout de même pour ta contribution! Apprécié :-) – Flukey

1

Dans Oracle, pour obtenir le jour de la semaine (1-7), utilisez la

suivante
select to_char(sysdate, 'D') 
from dual 

Ce qui rend trivial d'exclure les samedis et dimanches. La définition exacte des «jours ouvrables», cependant, est susceptible de varier considérablement d'un endroit à l'autre (et d'une entreprise à l'autre), alors dans ce cas, je suggère une table de base de données pour tenir les dates Rendez-vous).

+0

Excellent, merci! – Flukey

Questions connexes