|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre actif
![]() Développeur informatique Inscription : mai 2003 Messages : 400 ![]() |
Hello,
Un petit problème bête: sur un site j'affiche si un utilisateur a son anniversaire, s'il l'a demain ou l'a eu hier. Ma méthode actuelle : Je fais ce test dans la requête SQL en utilisant la fonction DAYOFYEAR : Code :
SELECT DAYOFYEAR(J.DOBJOUEUR) - DAYOFYEAR(CURDATE()) AS QUAND Le problème : ça ne fonctionne plus correctement si un utilisateur est né lors d'une année bissextile ou si on se trouve dans une année bissextile. Avez-vous des idées pour faire ce test en PHP ? |
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 131 ![]() |
il l'a eu n'y hier ni demain puisque le jour n'existe pas, t’embêtes pas pour ce genre de chose
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 |
|
Membre actif
![]() Développeur informatique Inscription : mai 2003 Messages : 400 ![]() |
Si un utilisateur est né le 10 juin, ce jour existe que l'année soit bissextile ou non. Par contre le calcul DAYOFYEAR ne retourne pas la même valeur, ce qui cause mon problème.
Pour le cas extrême où un utilisateur serait né le 29 février, je peux gérer par un If. |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : septembre 2010 Messages : 7 131 ![]() |
fait ton if alors ou est le problème ?
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#5 |
|
Membre actif
![]() Développeur informatique Inscription : mai 2003 Messages : 400 ![]() |
Le but est d'avoir une fonction qui retourne de -1 à 1 pour savoir si un jour se situe avant ou après le jour courant de manière simple. ça éviterait de devoir tout tester "1. L'utilisateur est-il né une année bissextile, 2. Sommes-nous dans une année bissextile, 3. L'utilisateur est-il né un 29 février" et de gérer tous ces cas y compris lorsqu'ils s'imbriquent.
N'y a-t-il pas de fonction PHP de comparaison de date permettant de gérer ces cas ? |
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : septembre 2010 Messages : 7 131 ![]() |
il va bien falloir lui définir une date par contre, si on est pas dans un année bissextile son anniversaire c'est le 28 ou 1 ? sinon tu verras que ça colle pas
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#7 |
|
Membre actif
![]() Développeur informatique Inscription : mai 2003 Messages : 400 ![]() |
La date c'est la date de naissance de l'utilisateur, je reprends mon exemple du 10 juin. Ma fonction actuelle dans la requête SQL DAYOFYEAR() ne retourne pas la même valeur si l'utilisateur est né le 10 juin 1996 (bissextile) ou 10 juin 1997.
Effectivement comme tu le dis le problème se pose uniquement si l'utilisateur est né une année bissextile après le 29 février, ce qui complique encore l'affaire. Bref, je cherche un moyen d'afficher "John Doe a son anniversaire hier / aujourd'hui / demain" en gérant tous ces cas. Je pensais qu'il existait des moyens simples en PHP, mais si ce n'est pas le cas je gérerai dans une fonction plus complexe. |
|
|
00
|
|
|
#8 | ||
![]() ![]() |
Facile à faire en SQL avec les fonctions de dates propre à ton SGBD et un CASE WHEN.
Avec MySQL, ça donnerait ceci : Code :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française ! Linuxiens, comptez-vous ! |
||
|
00
|
|
|
#9 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Nous sommes ici sur le forum Langage SQL, je n'utiliserai donc que les fonctions normalisées pour résoudre ton problème.
L'expression la plus simple pour calculer une date d'anniversaire est la suivante : Code :
dobjoueur + INTERVAL (EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM dobjoueur)) YEAR Malheureusement, lorsqu'on arrive sur le début/fin d'année, le résultat n'est plus cohérent. Je suis donc arrivé à la requête suivante : Code :
PS: A vérifier car je n'ai testé que sur le papier !
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com