8796 sujets

Développement web côté serveur, CMS

Bonjour,

J'espère que vous pourrez m'aider, il s'agit sans doute d'une erreur de syntaxe que je trouve incompréhensible :

J'ai 2 requettes quasi identiques, l'une fonctionne et l'autre pas.
Celle qui fonctionne :


$sql = 'SELECT *, FLOOR((TO_DAYS(date_deces) - TO_DAYS(date))/365.25) AS age FROM anniv_a WHERE date_deces != "0000-00-00" order by age desc limit 1'


Et celle qui ne fonctionne pas (la différence c'est date_deces == "0000-00-00" au lieu de date_deces != "0000-00-00")


$sql3 = 'SELECT *, FLOOR((TO_DAYS(date_deces) - TO_DAYS(date))/365.25) AS age FROM anniv_a WHERE date_deces == "0000-00-00" order by age desc limit 1';


Merci de votre aide !
Salut,

en SQL l'égalité se note = et non == Smiley cligne

Edit: en passant ta seconde requête est étrange puisqu'elle va te donner un age null et donc un order by très aléatoire.
Modifié par Heyoan (06 Feb 2009 - 15:11)
Oui j'ai testé avec juste le =, j'obtiens un résultat sans erreur mais qui est faux.
Comment tu vois ça et comment tu expliques ça ?

Merci !
webcrea a écrit :

Comment tu vois ça et comment tu expliques ça ?
Eh bien il faudrait surtout que tu expliques ce que tu cherches à obtenir.

TO_DAYS(madate) "Retourne le nombre de jours depuis la date 0 jusqu'à la date madate" en précisant que
a écrit :
TO_DAYS() n'est pas fait pour travailler avec des dates qui précèdent l'avènement du calendrier Grégorien (1582), car elle ne prend pas en compte les jours perdus lors du changement de calendrier.

En clair to_days( '0000-00-00' ) va retourner null. D'ailleurs même si cela avait retourné 0 je ne vois toujours pas ce que tu cherches à faire avec FLOOR((TO_DAYS(date_deces) - TO_DAYS(date))/365.25) AS age si date_deces n'est pas renseignée.
J'ai une base de données de personnes avec date de naissance et date de mort le cas échéant, et je cherche à sortir les plus vieux morts et vivants, et les plus jeunes morts et vivants. Donc pour les morts ça marche mais pas pour les vivants. Et je n'arrive pas à comprendre pourquoi ça marche dans un cas et pas dans l'autre.
Déjà ce serait plus explicite de renommer ton champ date en date_naissance (même s'il s'agit de l'une des exceptions des mots-clés réservés de Mysql).

Ensuite c'est simple :

* pour un âge au moment du décès :
FLOOR((TO_DAYS(date_deces) - TO_DAYS(date_naissance))/365.25)
* pour un âge à la date du jour :
FLOOR((TO_DAYS(NOW()) - TO_DAYS(date_naissance))/365.25)

Modifié par Heyoan (06 Feb 2009 - 17:03)
J'ai encore un petit souci. Je tente de sélectionner dans ma BDD toutes les personnes du même âge avec cette requete :


'SELECT *, FLOOR((TO_DAYS(NOW()) - TO_DAYS(date))/365.25) AS age FROM anniv WHERE date_deces = "0000-00-00" AND age = '.$age.' order by age'


Mais age = '.$age.' fait que ça ne fonctionne pas.
Pouvez-vous m'aider pour cette requete ?

Merci
webcrea a écrit :

Mais age = '.$age.' fait que ça ne fonctionne pas.
Je suppose que tu as fait un echo de ta variable ou de ta requête ?
Oui:


SELECT *, FLOOR((TO_DAYS(NOW()) - TO_DAYS(date))/365.25) AS age FROM anniv_a WHERE date_deces = "0000-00-00" AND age = 66


Là je prends l'exemple des personnes qui ont 66 ans. Et j'obtiens un warning :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL

Quand je retire AND age = 66, la requete fonctionne.
Salut,

petit rappel : WHERE permet de filtrer les champs existant dans les tables. Pour filtrer les résultats de la requête (ce qui est le cas de la variable age) il faut utiliser HAVING.

Ce qui donne :
SELECT *, FLOOR((TO_DAYS(NOW()) - TO_DAYS(date))/365.25) AS age FROM anniv_a WHERE date_deces = "0000-00-00" HAVING age = 66
Heyoan a écrit :


petit rappel : WHERE permet de filtrer les champs existant dans les tables. Pour filtrer les résultats de la requête (ce qui est le cas de la variable age) il faut utiliser HAVING.


j'adore ce genre de "petit" rappel ... Smiley lol surtout étant un piètre "Sqliste" !! Smiley rolleyes
Toujours dans le même genre d'idée, est-il possible de sélectionner dans ma base la liste de tous les ages ?

j'ai tenté ça mais sans succès :


$sql = 'SELECT *, FLOOR((TO_DAYS(NOW()) - TO_DAYS(date_naissance))/365.25) AS age FROM anniv_a GROUP BY age ORDER BY age';


J'aimerais juste avoir la liste des âges contenu dans la base à partir des dates de naissance, allant de 15 à 90 ans par exemple.

Merci de votre aide ! Smiley smile
Plop !

webcrea a écrit :
J'aimerais juste avoir la liste des âges contenu dans la base à partir des dates de naissance, allant de 15 à 90 ans par exemple.
En reprenant mot pour mot cette demande ça donne :
SELECT DISTINCT FLOOR((TO_DAYS(NOW()) - TO_DAYS(date_naissance))/365.25) AS age FROM anniv_a HAVING age between 15 AND 90 ORDER BY age