IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

DATE + 1 month


Sujet :

Langage SQL

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut DATE + 1 month
    Bonjour,

    Je travaille avec une base mysql V.5

    Malgré de nombreuses recherche sur ce forum et ailleurs, je n'arrive pas à faire cela :

    • Extraire les valeurs par mois (exemple : du 1er juin et le 30 juin) pour le mois en cours, le mois prochain, le mois + N


    Ma requête part de la date du jour et prend pas en compte les valeurs de tout le mois. Donc , cela ne convient pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     SELECT 
                 case  when A.dt_confirmation between current_date and date(DATE_ADD(NOW(), INTERVAL 1 MONTH))
                  then SUM(A.qt_cmde_ini) else "" end as qt3
              FROM TABLE
    J'ai une autre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select case when (CONCAT(YEAR(A.date_livr_demande),MONTH(A.livr_demande))) = (CONCAT(YEAR(CURDATE()),(MONTH(CURDATE()))
                     then SUM(A.qt_cmde_ini) else "" end)
    Mais cela ne marche pas non plus.

    Le résultat attendu est :

    Mois : 06/09|...|07/09|...|08/09|...|09/09|...|10/09
    Valeur:20653|...|54065|...|3543|...|55579|...|5465
    Auriez vous une idée ?

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Je cherche l'équivalent de" ADD_periode" qui n'est pas pris en compte par mon SGBD.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    En principe l'ajout d'une unité de mois est strictement interdit par la norme SQL. En effet, les mois ne comptant pas le même nombre de jours, l'ajout d'une unité de durée MOIS à une date n'a pas de sens.

    Certains SGBDR permettent cependant de telles âneries.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Ok donc si j'ai bien compris :

    Je ne peux remonter mes résultats par mois que si je spécifie les mois ?

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SElect case when dt_livraison between "2009/06/01" and "2009/06/30" then px_commande end
    Mais, je ne peux pas rentrer toutes les dates à la main, faire ceci pour toute l'année et les années suivantes, cela serait trop complexe !

    Le principe est de dire :

    Je veux tous les résultats pour le mois en cours : Juin et pour les 7 mois
    à venir.

    Même si on est le 15 juin 2009, je souhaite que cela me retourne les résultats du 1 juin au 30. Et pas à partir du 15 au 15 juillet.

    De plus, si j'édite ma requête au mois se septembre : cela me donnera les résultats du mois de septembre + 7 mois.

    Je crois ne pas être clair alors que la demande est simple.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Alors, faites encore plus simple et incorporez une table de date comme je l'ais indiqué dans cet article :http://sqlpro.developpez.com/cours/gestiontemps/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Et oui, c'est bien plus pratique d'avoir une table date !!!

    Mais, n'y a t il pas une solution sans, car la base est grosse et j'ai peur d'en
    perturber son fonctionnement.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select case when
      A.dt_livr_demande between DATE_ADD(month(current_date), INTERVAL 1 MONTH) and DATE_ADD(month(current_date), INTERVAL 2 MONTH)
                     then SUM(A.qt_cmde_ini) else "" end
    Mais cela ne marche toujours pas ...

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Bien au contraire vous allez en augmenter les performances. En effet l'utilisation de fonction rend généralement les requêtes itératives (SCAN) alors qu'avec des jointures c'est ensemblistes (recherche dans l'index).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Je comprends bien mais ce n'est pas ma base et je n'ai pas le droit d'y toucher.

    Donc je toujours le même problème ...

    Si quelqu'un a déjà géré ce problème sans des tables date, il est le bienvenu !

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Ok !!

    J'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Case EXTRACT(MONTH FROM Dt_livr_demande)
    WHEN month(current_date) + 3   THEN px_commande
    END
    Pas besoin de table date ....

    Merci à tous

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Si vous êtes en décembre, month(current_date) + 3 ça donnera 15 !

  11. #11
    Nouveau membre du Club
    Inscrit en
    Juillet 2008
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    nn
    si vous etes a decembre et vous fait

    dateadd(datepart(month,15/12/2008),1)

    il vous donne ''15/01/2009"

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je réponds, je ne réponds pas, je réponds, je ne réponds pas... j'hésite.

    Allez je ne réponds pas ! Mais c'était moins une !

  13. #13
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Yep !

    Bien vu Waldar !

    Pour moi le problème s'avérait résolu ... Du coup, je ne suis pas retourné sur le forum, d'où mon absence.

    Datepart ne marche avec mysql ...

    Du coup, je cherche une solution . Je vous tiens au courrant :

  14. #14
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Voici pour l'adaptation mysql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Case EXTRACT(MONTH FROM Dt_livr_demande)
                        WHEN month(date_add((current_date),interval 7 month))
                        THEN px_commande
                    else "" END from tbl_ligneachat
    Résultat : px_commande de janvier 2010, 2009,2008,2007.

    Maintenant, il ne me reste plus qu'à gérer les années.

  15. #15
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    Bon à savoir :

    ------> "Extract month from ..." ne ramène qu'un nombre entre 1 et 12, on perd donc la notion d'année.

    Peut être qu'avec Year_month, cela peut faire l'affaire...

    Je continue de chercher !

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je ne suis pas sûr d'avoir bien compris votre besoin mais, d'après le résultat attendu, je dirais que vous voulez faire la somme des qt_cmde_ini par mois à partir du mois en cours ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DATE_FORMAT(A.date_livr_demande, '%m-%Y') AS Mois, SUM(A.qt_cmde_ini) AS Quantité
    FROM LaTable
    WHERE A.date_livr_demande >= STR_TO_DATE(CONCAT(EXTRACT(YEAR FROM CURRENT_DATE), '-', EXTRACT(MONTH FROM CURRENT_DATE), '-', 01))
    GROUP BY DATE_FORMAT(A.date_livr_demande, '%m-%Y')
    A essayer.
    Ou chercher une solution convenant mieux à votre besoin à l'aide de la doc MySQL sur les fonctions de dates.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  17. #17
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 139
    Points : 73
    Points
    73
    Par défaut
    J'utilise la fonction LAST_DATE et cela fonctionne, mais j'avoue que c'est drôlement alambiqué comme code !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT case when dt_livr_demande between (date_add(date_add(last_day(current_date), interval 1 day),interval 6 month)) AND (date_add(last_day(current_date),interval 7 month))
     then qt_cmde_ini
    else NULL
    end,
     FROM tbl_ligneachat A
    Encore merci à tous

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/06/2014, 09h33
  2. [AC-2000] Ajouter 1 mois sur date format month/year
    Par Ckikikirame dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 06/09/2009, 20h03
  3. Insert date day/month/year
    Par Arnaud62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/12/2008, 16h06
  4. Réponses: 8
    Dernier message: 07/03/2007, 08h34
  5. [Date] Comment déclarer une variable de la forme (year-month-day)?
    Par adil_vpb dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/03/2007, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo