Forum Programmation.SQL Manipulation de dates

Posté par  . Licence CC By‑SA.
Étiquettes :
4
2
jan.
2019

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  . É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  (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 et if - qui peut s'appeler iif).

      • [^] # Re: modulo sur le mois

        Posté par  . É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  . É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  . Évalué à 2.

      Je n'ai pas compris ta solution. Désolé :/

      • [^] # Re: utiliser TRUE = 1

        Posté par  . É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

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.