Bonjour,
cela fait maintenant plusieurs jours que n'arrive pas à résoudre mon problème de DATEDIFF. Je m'explique:

Dans mon fichier PHP j'ai une variable $ddn qui reçoit le $_POST['ddn'] de mon formulaire. Cette variable reçoit un string de type 20/07/2015. J'aimerai calculer alors l'âge de la personne au moment de l'inscription grâce à la date de naissance.

Voici ma requête :

INSERT INTO infos_membres(ddn_membre) 
            VALUES ('DATEDIFF(NOW(), DATE_FORMAT($ddn, '%Y-%m-%d'))' );

j'ai aussi essayé sans le DATE_FORMAT() mais ça ne marche pas non plus.

Une autre question, la date est-elle retournée en jours ou en année ? Si elle es retournée en jours, comment faire pour la passer en année ?

Je vous remerci d'avance pour votre aide ! :D

13 réponses


maagiix
Auteur
Réponse acceptée

J'ai réussi à trouver une solution et ça marche ! Comme me l'a conseillé Arnich, j'ai cherché un moyen de traiter ma requête en php avant de l'envoyer dans la bdd, et j'ai trouvé ceci:

function Age($date_naissance)
{
    $arr1 = explode('/', $date_naissance);
    $arr2 = explode('/', date('d/m/Y'));

    if(($arr1[1] < $arr2[1]) || (($arr1[1] == $arr2[1]) && ($arr1[0] <= $arr2[0])))
    return $arr2[2] - $arr1[2];

    return $arr2[2] - $arr1[2] - 1;
}

j'ai juste à faire un $age = Age($ddn); et ça marche très bien, l'âge est bien rentré dans ma bdd :)
Encore merci beaucoup à vous deux de m'avoir aidé à résoudre mon problème ! :D

maagiix
Auteur

Il y a une parenthèse en trop, la requête est:

INSERT INTO infos_membres(ddn_membre) 
            VALUES ('DATEDIFF(NOW(), DATE_FORMAT($ddn, '%Y-%m-%d')' );

Bonjour maagiix,

Tu devrais changer le format de $ddn avant de l'envoyer à MySQL

$myDateTime = DateTime::createFromFormat('d/m/Y', $ddn);
$ddn = $myDateTime->format('Y-m-d');
...
INSERT INTO infos_membres(ddn_membre) VALUES ( DATEDIFF(NOW(), $ddn ));
maagiix
Auteur

Merci pour ta réponse ! :)
J'ai essayé le code que tu m'as dit mais ça ne marche pas, il n'y a pas de nouvelle ligne qui se créer mais par contre quand je remplace le datediff part '19' pour tester, la ça marche il m'ajoute bien une nouvelle ligne avec 19 pour l'age :/
Saurais-tu d'où pourrait venir le problème ?

Tu peux tester ta requete directement en SQL pour voir si elle est bien formaté.
Si tu utilise PDO tu peux ajouter des exception avec try catch.

maagiix
Auteur

J'ai essayé ma requête dans Mysql directement:

INSERT INTO infos_membres(age_membre) VALUES (DATEDIFF(year, NOW(), '1996-04-25' ));

et ça m'affiche l'erreur suivante:

1582 - Incorrect parameter count in the call to native function 'DATEDIFF'

alors du coup j'ai enlevé le year de DATEDIFF et la ça a fonctionné mais forcément ça m'a créé une ligne avec l'age en jours soit 7025 ^^
Donc si le year ne fonctionne pas c'est un problème de version de MySQL ?

maagiix
Auteur

J'ai réessayé depuis mon formulaire avec ma variable $ddn sans le year de DATEDIFF et ça m'insère '0' dans age_membre. Saurais-tu pourquoi ?

Il semblerai que datediff ne retourne pas un nombre d'année.
J'ai trouvé cette requete qui semble faire le travail : (non testé)

create table table (date1 date, date2 date);
insert into table values
('2011-07-20', '2011-07-18'),
('2011-07-20', '2010-07-20'),
('2011-06-15', '2008-04-11'),
('2011-06-11', '2001-10-11'),
('2007-07-20', '2004-07-20');
select date1, date2,
YEAR(date1) - YEAR(date2)
    - (DATE_FORMAT(date1, '%m%d') < DATE_FORMAT(date2, '%m%d')) as diff_years
from table;

Sinon tu peux faire ton calcul dans ton code PHP avant d'envoyer à MYSQL

j'ai édité, il n'y a pas de 'year', désolé
de quel type est age-membre ?

DATEDIFF retourne un nombre de jours sous MySQL (le year c'est sous SQL Server)

maagiix
Auteur

Arnich: Merci, je vais regarder si je trouve ça en php :)
Huggy: Age_membre est de type int(2) et contient l'âge en année, tu penses que je dois le mettre en date ?

Si tu veux des années, divise par 365

INSERT INTO infos_membres(age_membre) VALUES (DATEDIFF(NOW(), '1996-04-25' )/365);

En manipulant un objet Carbon ou Datetime je pense que tu aurais pu eviter les explode et optimiser un peu le code.