2009-10-12 7 views
1

Si nous avons la gamme de date suivants:Combien de jours ont eu lieu au cours d'une Timespan Compte tenu

1er Octobre 2009 - le 20 Octobre 2009

Peut-on calculer combien de lundi ont eu lieu au cours de

La réponse ce serait (3)

M T W T F S S 
      *1 2 3 4 
    5 6 7 8 9 10 11 
12 13 14 15 16 17 18 
19 *20 21 22 23 24 25 
26 27 28 29 30 31 

Pouvons-nous le faire dans MySQL, sinon peut-il être fait en PHP ou devrais-je créer une fonction

Répondre

1

sdt = date de début de l'intervalle, edt = date de fin de l'intervalle. Changez '2' pour refléter le jour de la semaine que vous voulez compter.

CREATE FUNCTION NMONDAYS(sdt DATETIME, edt DATETIME) 
RETURNS INT DETERMINISTIC RETURN TIMESTAMPDIFF(WEEK, sdt, edt) 
+ IF(DAYOFWEEK(edt) >= 2 AND DAYOFWEEK(edt) < DAYOFWEEK(sdt),1,0) 
+0

Will Try that ... et vous faire savoir –

+0

Vous sexy S0B ... Aimez-vous .... .... btw est 1: dimanche 2: lundi 3: mardi ... et ainsi de suite? –

+0

Oui, ils sont: http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html#function_dayofweek –

0
function daysBetween($from, $to, $round = true) { 
    // assume from and two can be valid date() values or strings 
    $from = strtotime($from); 
    $to = strtotime($to); 
    $diff = $to - $from; 
    $days = $diff/86400; 
    return ($round) ? floor($days) : round($days, 2); 
} 
+1

qui donnerait seulement le nombre de jours entre 2 dates .. non? –

+0

Toute chance que vous pouvez changer le retour pour refléter Si les conditions ....: D S'il vous plaît –

+0

O wait NVM ... le ci-dessus ne retournera que le Nombre de jours entre deux dates –

1

Vous pouvez commencer par quelque chose comme:

select datecol1, TIMESTAMPDIFF(DAY,datecol1,datecol2) as numDays from table; 

Puis en PHP, vous pouvez assez comprendre directement combien de mondays suivre d1, selon le jour de la semaine d1 est (vous pouvez utiliser la date() et strtotime() pour comprendre cela), et la valeur de numDays dans le jeu de résultats.

EDIT: code non testé, mais l'idée générale devrait fonctionner:

function daysUntilMonday($date){ 
    $dayOfWeek = date('w',strtotime($date)); //a number from 0-6, sunday is 0 
    $daysTillMonday = (8 - $dayOfWeek) % 7; //modulus is your friend. 
    return $daysTillMonday;  
} 

function countMondays($start,$numDays){ 
    $numDays = $numDays - daysUntilMonday($start); 
    return floor($numDays/7)+1; 
} 

Peut-être hors d'un, mais devrait être généralement la bonne approche.

HTH

+0

OO qui me donne les jours qui se sont produits. Maintenant, j'ai besoin de savoir comment de nombreux lundi a eu lieu :( –

1

pas sûr si c'est possible avec MySQL. PHP est votre ami .. plusieurs façons d'y arriver .. obtenir l'horodatage de début et de fin timestamp en utilisant strtotime probablement .. puis exécutez une boucle for ou quelque chose de l'horodateur de début à l'horodatage en ajoutant 86400 et à chaque incrément vérifier la date ("D", $ mkt) == 'Mon' et voir si c'est lundi et ensuite incrémenter votre compteur. vous avez donné l'idée approximative .. vous pouvez comprendre le code à partir de là.

+0

Je pense que l'utilisation de la solution Timedev avec une combinaison de solution cballou je peux le faire dans la fonction MYSQL –

+0

bien si vous voulez écrire une procédure pour cela, je suis sûr que c'est très possible avec MySQL .. sinon je ne peux pas penser à un moyen raisonnable d'y arriver autre que de créer une table temporaire ou autre chose.Essayer les jours n'est pas un problème du tout .. mais s'assurer que vous avez le bon nombre de lundi est le problème principal Si vous arrivez à le faire avec MySQL, n'hésitez pas à nous en faire part ici –

+0

Il serait vraiment intéressant de voir une fonction dans mySQL Vous pourriez probablement utiliser mon code php (probablement flakey) comme point de départ.Les parties délicates de ce genre de comptage de date sont toujours les cas limites (que se passe-t-il quand il y a zéro lundi entre les dates, etc.) – timdev

0

Dans sql:

SELECT DATEDIFF(
     ADDDATE('20091001', 9 - CASE WHEN DAYOFWEEK('20091001') = 1 THEN 8 
            WHEN DAYOFWEEK('20091001') = 2 THEN 9 
            ELSE DAYOFWEEK('20091001') 
           END), -- first monday after date1 
     ADDDATE('20091020', 2 - CASE WHEN DAYOFWEEK('20091020') = 1 THEN 8 
            ELSE DAYOFWEEK('20091020') 
           END) -- first monday before date2 
       )/7 + 1 -- divide the difference by 7 gives number of weeks 
         -- add 1 (nb points = nb intervals + 1) 
      ) NbMonday 
0

Ou ceci:

// Pass $date_1, $date_2 as timestamps, $dow as 3-letter abbrev. (e.g. 'Mon'). 
// Dates can be low to high or high to low. 

function dow_between($date_1, $date_2, $dow) 
{ 
    if ($date_2 < $date_1) { 
     list($date_2, $date_1) = array($date_1, $date_2); 
    } 
    for ($num_dow = -1; $date_1 <= $date_2; $num_dow++) { 
     $date_1 = strtotime('next ' . $dow, $date_1); 
    } 
    return $num_dow; 
} 

Edité pour gérer les dates soit l'ordre.

Questions connexes