Bonjour,
je cherche à faire quelque chose d'assez simple en théorie mais qui se révèle assez compliqué en pratique.
Pour une date donnée, je veux récupérer une année. Vous me direz que la fonction YEAR() fait assez bien l'affaire. Certes.
Seulement, mon calendrier ne démarre pas au 1er janvier pour se terminer au 31 décembre mais du 1er septembre au 31 aout.
Ce qui veut dire que j'aimerais bien une fonction (YEAR2 par exemple) qui fasse ce que fait YEAR mais avec mon calendrier.
Quelques exemples en vrac:
- 31/12/2018 -> 2018
- 01/01/2019 -> 2018
- 31/08/2019 -> 2018
- 01/09/2019 -> 201*9*
Vous voyez l'idée ?
Ce code me sert à gérer des stats sur des saisons sportives afin d'alimenter quelques challenges internes.
Merci pour votre aide
# modulo sur le mois
Posté par Frédéric Heulin . Évalué à 2. Dernière modification le 02 janvier 2019 à 08:45.
Je ne suis pas un expert SQL mais cela pourrait-il fonctionner ? :
YEAR(date) + 1 - MOD(MONTH(DATE),8)
[^] # Re: modulo sur le mois
Posté par ComputingFroggy (site web personnel) . Évalué à 4.
Très élégante solution mais pas tout à fait correcte,
Mod
retourne le reste de la division, il faut effectuer une division :SELECT YEAR(curdate()) - 1 + floor(MONTH(curDATE())/8)
Sinon de manière plus lisible on peut écrire :
SELECT if(month(curdate()<9), YEAR(curdate()) - 1, YEAR(curdate()))
A noter que tout ceci est écrit en MySQL, selon le dialecte utilisé les noms de fonctions peuvent changer (en particulier
curdate
,floor
etif
- qui peut s'appeleriif
).[^] # Re: modulo sur le mois
Posté par Xavier Maillard . Évalué à 2. Dernière modification le 02 janvier 2019 à 10:33.
Super !
J’étais parti sur une fonction (qui fonctionnait bien mais c'est complètement overkill !).
Un grand merci pour l'aide.
# utiliser TRUE = 1
Posté par Bernez . Évalué à 6.
On peut exploiter le fait qu'en MySQL, les opérateurs booléens renvoient 0 ou 1 :
YEAR(date) - (MONTH(date) < 9)
.[^] # Re: utiliser TRUE = 1
Posté par Xavier Maillard . Évalué à 2.
Je n'ai pas compris ta solution. Désolé :/
[^] # Re: utiliser TRUE = 1
Posté par Frédéric Heulin . Évalué à 5. Dernière modification le 02 janvier 2019 à 10:37.
31/08/2019 -> 2018 : YEAR(date) - (MONTH(date) < 9) = 2019 - (TRUE) = 2019 - 1 = 2018
01/09/2019 -> 201*9* : YEAR(date) - (MONTH(date) < 9) = 2019 - (FALSE) = 2019 - 0 = 2019
En remplaçant date par curdate() comme le mentionne computingFroggy
[^] # Re: utiliser TRUE = 1
Posté par Xavier Maillard . Évalué à 2.
Ah oui ! C'est très malin ça aussi.
Prix de beauté !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.