30 05 2002 à 06:03 |
salut j'ai une table membres avec les dates de naissance sur 3 champs (jour, mois, année). j'aimerais recevoir une notif quotidienne avec les anniversaires a venir, par exemple : * devil aura 11 ans dans 4 jours * line renaud aura 244 ans dans 1 semaine * yoda aura 901 ans demain existe-il en mysql une fonction permettant de calculer un intervalle entre deux dates (parce qu'en php j'ai pas trouvé et c'est passablement TRES TRES compliqué entre les heures d'été et d'hiver, les années bissextiles et le reste) ? sinon il faudra écrire cette maudite fonction et il y aura surement des bugs a tout va le 29 février, en début et en fin d'année vous tiendrai au courant si ca vous intéresse pas la suite. a+ |
|
30 05 2002 à 06:18 |
Je sais que MySQL a dez fonctions de traitement de date donc je vais jeter un oeil et je te tiens au courant. bonne journée. [Edit] Fonction Mysql : http://dev.nexen.net/docs/mysql/annotee/manuel_... Fonctions PHP : Il existe un librairie nommée MCAL mais je sais pas si elle est dispo chez Online ... Regarde là : http://dev.nexen.net/docs/php/annotee/ref.mcal.... [End Edit] |
|
30 05 2002 à 07:25 |
Avec PHP tu peux passer en date "absolue" (nombre de ms depuis je-sais-plus-quand-dans-les-années 70) Unix, ça peut faire l'affaire ? Tu fais la différence entre les deux dates absolues, petite conversion en jours et hop ! |
|
30 05 2002 à 07:40 |
Ca règle pas vraiment le gros problème des trous spatio-temporels créés par février et les années bissextiles... "Beam me up Scotty" |
|
30 05 2002 à 07:43 |
Ben, si la fonction PHP (c'est mktime il me semble ?) est pas trop débile, elle "sait" quelle année est bissextile et tout et tout, je vois pas trop où est le soucis $date1 = mktime(paramètres qui vont bien) $date2 = mktime(paramètres qui vont bien) $nb_jours_int = ($date1 - $date2) / (24*3600*1000) ou un truc dans le style |
|
30 05 2002 à 08:52 |
en SAL tu as une fonction qui s'appelle MONTH_BETWEEN ou quelque chose comme ca, qui renvoie le nombre de mois entre 2 dates, et en MYSQL tu as PERIOD_DIFF qui fait la meme chose PERIOD_DIFF(P1,P2) Returns the number of months between periods P1 and P2. P1 and P2 should be in the format YYMM or YYYYMM. Note that the period arguments P1 and P2 are not date values: mysql> SELECT PERIOD_DIFF(9802,199703); -> 11 je fais encore d'autres recherches, parce que j'ai déja utilisé ce genre de fonction et je suis sur que ca existe (ou alors j'avais combiné plusieurs fonctions), |
|
30 05 2002 à 09:32 |
Je crois qu'il existe une fonction, voici la syntaxe : $intervalle=entre_deux_dates($date1,$date2); elle retourne le nombre de milli-secondes écoulés entre date1 et date2. $date1 et $date2 sont de la forme aaaa/mm/jj. A+ |
|
30 05 2002 à 12:11 |
hello, Comme ça m'interressait aussi, j'ai fait un tit script. En fait pour les dates en php, tout tourne autour de mktime et de strftime. mktime retourne le nombre de secondes depuis le 1er janvier 1970 à partir de variables données en paramètre. (jour, mois, années, heures, minutes, secondes) strftime joue le rôle inverse : il convertie le nombre de secondes donné en paramètre et renvoie une date formatée. // definition du jour de la naissance de l'individu : $mois_naissance = 9; $jour_naissance = 20; $annee_naissance = 1984; $naissance_s = mktime(0,0,0,$mois_naissance,$jour_naissance,$anne e_naissance); $aujourdhui_s = mktime(0,0,0,date("m"),date("d"),date("Y")); $anniversaire_s = mktime(0,0,0,$mois_naissance,$jour_naissance,date( "Y")); $intervale_s = $anniversaire_s - $aujourdhui_s; if ($intervale_s < 0) { $annee_prochaine = date ("Y"); $annee_prochaine++; $anniversaire_s = mktime(0,0,0,$mois_naissance,$jour_naissance,$anne e_prochaine); $intervale_s = $anniversaire_s - $aujourdhui_s; } // maintenant intervale_s est le temps en secondes avant le prochain anniversaire de l'individu. // CONVERSION en jours $intervale_j = $intervale_s / (60 * 60 * 24); echo "L'anniversaire de l'individu est dans ".$intervale_j." jours. <br> "; // CONVERSION en jours ET mois : $intervale_nbr_de_jours = strftime("%d",$intervale_s); $intervale_nbr_de_mois = strftime("%m",$intervale_s); echo " <br> L'anniversaire de l'individu est aussi dans ".$intervale_nbr_de_jours." jours, ".$intervale_nbr_de_mois." mois. <br> "; Note que pour la conversion en jours ET mois, j'ai du tricher un peu et le résultat n'est pas garantie à 100% lors des cas particuliers (années bisextiles etc ...) Par contre, je viens d'avoir une idée pour avoir un résultat garantie à 100%. Je retourne en cours, je cherche pis je te donne la réponse ce soir ;) [edit : ] le script fonctionne bien, apparemment ... j'aurais 18 balais dans 4 mois et 24 jours : http://www.netplayergames.com/test.php |
|
30 05 2002 à 15:07 |
Salut pg essaie ça: //Verification si une année est bissextile ou pas Function bissextile($annee) { $i = $annee; if(($i % 4 == 0)&&(($i % 100 != 0)||($i % 400 == 0))) { return true; } else { return false; } } //Calcul du nombre de jours pour chaque année séparant les deux dates Function nbjourannee($date1, $date2) { $a1 = $date1[2]; $a2 = $date2[2]; If ($a1 == $a2) { $nbjourannee = 0; } else { $i = $a2; $nbjourannee = 0; While ($i < $a1) { $nbjourannee = $nbjourannee + 365; If (bissextile($i)) { $nbjourannee = $nbjourannee + 1; } $i++; } } return $nbjourannee; } //Calcul du nombre de jours par rapport au premier janvier de la date Function nbjanvier($ldate) { $nbmois = Array("","0","31","59","90","120","151","181","212 ","243","273","304","334"); $j = $ldate[0]; $m = $ldate[1]; $a = $ldate[2]; $nbjanvier = $nbmois[$m] + $j; If ((bissextile($a)) && ($m > 2)) { $nbjanvier = $nbjanvier + 1; } return $nbjanvier; } //Calcul du nombre de jours entre deux dates Function nbjour($date1, $date2) { $nbjourannee = nbjourannee($date1, $date2); $nbjanvier1 = nbjanvier($date1); $nbjanvier2 = nbjanvier($date2); return $nbjour = $nbjourannee + $nbjanvier1 - $nbjanvier2; } voila c un peut long mais... aller @+ |
|
30 05 2002 à 15:35 |
angel " Je sais que MySQL a dez fonctions de traitement de date " period_add period_diff curdate curtime date_add date_format date_sub dayname unix_timestamp to_days... je me suis renseigné faut pas croire aucune n'est convenable, elles utilisent les timestamps unix. naxos " Unix, ça peut faire l'affaire ? " les timestamps unix sont absolument parfaits. perso j'adore. j'adorais jusque-là. un timestamp unix est un entier représentant le nombre de secondes écoulées depuis le 1 janvier 1070. parfait. parfait sauf que la fonction retourne -1 pour les dates antérieures et cas particulier : comment je fais pour calculer l'age d'un membre né avant le 1er janvier 1970 hein ??? ben ca plante évidemment. timestamp caca pour bosser avec des dates antérieures à 1970. sinon du bonheur en boite ce format. naxos " Avec PHP tu peux passer en date "absolue" " je veux pas le faire avec php. il faurdrait que je sélectionne tous les enregistrements (plusieurs milliers) pour les traiter en php. NON. je veux faire ma sélection directe en mysql et limiter la sélection à 15-20 membres (on anticipe les anniversaires sur 10 jours) angel " Ca règle pas vraiment le gros problème des trous spatio-temporels créés par février et les années bissextiles " on s'en fout ! on calcule des anniversaires. on se moque de l'année. on travaille que sur le jour et le mois. juste il faut faire attention. exemple : anniversaire le 1er mars. on est le 28 fevrier. si c'est bissextile, il faut pas dire "anniversaire demain!!!". il faut juste savoir si l'année en cours est bissextile ou pas. les autres (entre l'année courante et l'année de naissance, on s'en moque) patrouilleur " en MYSQL tu as PERIOD_DIFF qui fait la meme chose " c'est de la crotte. ca calcule in intervalle exprimé en mois entre deux dates exprimées en mois aussi. bonjour la précision pour les anniversaires à +- 1 mois pres remake " Je crois qu'il existe une fonction entre_deux_dates($date1,$date2); " c'est une blague n'est-ce pas ? huhu très drole cette fonction utilisateur fait surement appelle aux timestamps. elle convertit les 2 dates en timestamps unix, et elle fait la différence. easy. et comment tu fais la différence entre la date courante (2002 sur le calendrier lémurien) et une date antérieure a 1970 ? sans les timestamps ? tu fais comme moi. tu faiblis. freaker tout pareil. curieux de voir le résultat avec une date de naissance antérieure a 1970 ;) asdesign merci pour toutes ces fonctions !! a tester de suite maudits timestamps ! maudits vieux (> 32 ans)! ;) |
|
30 05 2002 à 15:49 |
pourquoi pas mettre une var fantôme sur les vieux et remonter leur âge à 1970 ça change rien pour leur anniversaire...une bonne cure de rajeunissement...sinon j'y comprends rien à tout ça je m'en retourne jouer de la flûte. |
|
30 05 2002 à 16:25 |
arf gwan, mon script fonctionne très bien avec les vieux de plus de 32 ans ;) essaye-là avant de dire quoi que ce soit : Le timestamp sera tout simplement négatif ... et alors ? on s'en fout exemple : $naissance_s = mktime(0,0,0,9,20,1954); echo $naissance_s; donnera : -482288400 ce qui ne changera rien au fonctionnement de la fonction ! Sinon, j'ai cherché pour avoir l'intervale en jours ET en mois mais la méthode est fastidieuse. euh ... avoir le résultat en jours uniquement c'est déjà bien nan ? ^^ |
|
30 05 2002 à 17:10 |
JC > lol ki a dit que j'aurai 11 ans ds 4 jours??? lol lol g un gato ou d smarties ??? |
|
30 05 2002 à 17:24 |
j'ai testé un petit truc tout a l'heure, sans faire appel aux timestamps. la fonction travaille uniquement sur les jours et les mois avec des tableaux de valeurs prédéfinies http://www.piregwan.com/maintenance/afficher_an... je teste ta fonction de suite freaker... ... ... ayé c'est testé. mince ca marche meme avec un gars né en 1515 ;) bon ben toutes mes excuses, je vais faire un meltingpot avec les deux fonctions merci mon bon freaker. la mienne etait plus couille molle ;) jette un oeil : <?php $mois_suivants = array ( "01" => "02", "02" => "03", "03" => "04", "04" => "05", "05" => "06", "06" => "07", "07" => "08", "08" => "09", "09" => "10", "10" => "11", "11" => "12", "12" => "01" ); $nb_jours_par_mois = array ( "01" => "31", "02" => "28", "03" => "31", "04" => "30", "05" => "31", "06" => "30", "07" => "31", "08" => "31", "09" => "30", "10" => "31", "11" => "30", "12" => "31" ); $jour_courant=date("d"); $mois_courant=date("m"); $mois_suivant=$mois_suivants[$mois_courant]; function afficher_anniversaire($jour_anni, $mois_anni, $nb_jours_anticipation, $cle_membre) { // $jour_anni : jour de l'anniversaire du membre // $mois_anni : mois de l'anniversaire du membre // $nb_jours_anticipation : anticipation pour feter l'anniversaire du membre en nb de jour // $nb_jours_anticipation doit etre compris entre 2 et 27 jours // $cle_membre : clé du membre global $mois_suivant; global $nb_jours_par_mois; global $jour_courant; global $mois_courant; global $mois_suivant; if ($mois_anni==$mois_courant) { // ANNIVERSAIRE DANS LE MOIS COURANT $nb_jours_avant_anni=$jour_anni-$jour_courant; return verifier_anniversaire($nb_jours_avant_anni, $nb_jours_anticipation, $cle_membre); } else if ($mois_anni==$mois_suivant) { // ANNIVERSAIRE DANS LE MOIS SUIVANT $nb_jours_avant_anni=($nb_jours_par_mois[$mois_cou rant]-$jour_courant)+$jour_anni; return verifier_anniversaire($nb_jours_avant_anni, $nb_jours_anticipation, $cle_membre); } return "le membre $cle_membre a son anniversaire dans trop longtemps (2) <br> "; } ?> |
|
30 05 2002 à 18:32 |
houla pas mal le coup du tableau avec le nombre de jours par mois ! Mais t'aurais eu un décalage d'un jour lors d'une année bissextile non ? En plus, ya pas d'année bissextile tous les 400 ans ... et tous les 2000 ans yen a quand même ^^ (chapeau Asdesign pour la fonction : elle est de toi ?) Heureusement qu'elles sont là quand même, les fonctions mktime et strftime ... pfiou |
|
Pour répondre à ce sujet (et notifier automatiquement son auteur), cliquez sur le bouton REPONDRE A CE SUJET. Si vous voulez en plus avertir de votre réponse une personne qui a participé à ce sujet, cliquez sur le bouton en face de son intervention. Enfin si vous voulez inviter quelqu'un à réagir, utilisez les appeaux ci-dessous. Seuls les membres logués peuvent utiliser les appeaux et seuls les membres actifs peuvent être appeautés ^^. Bonne notification ! Vous n'êtes pas membre ou vous n'êtes pas logué(e) ou les appeaux sont désactivés dans votre profil. Vous ne pouvez pas utiliser les appeaux. |