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

SQL Firebird Discussion :

DateAdd et février


Sujet :

SQL Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut DateAdd et février
    Salut !
    dans un de mes codes je me suis aperçu que DateAdd ne donne aucun résultat quand je lui passe comme argument le mois de février.

    pour pouvoir me suivre je mets le bout de code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    BEGIN
    FOR
         select
            d.code_unite,
            d.nom_unite,
     
            sum( c.frais_total ) frais_total,
     
            sum( a.montant_facture  ) montant_facture,
            sum( ( e.volume_mj_sortie ) * ( e.nombre_jour_reel ) ) volume_mj_sortie,
     
            /* calcul du ratio d'épuration */
            (
                 (  sum( c.frais_total  )   +  sum( a.montant_facture  )  ) /
                 ( sum( ( e.volume_mj_sortie ) * ( e.nombre_jour_reel ) ) )
            ) ratio
     
        from tb_energie a
            inner join tb_step b on ( a.code_step = b.code_step )
            inner join tb_frais_exploitations c on ( b.code_step = c.code_step )
                    and ( c.date_mois between :date_debut and :date_fin )
            inner join tb_unite d on ( b.code_unite = d.code_unite )
            inner join tb_process e on ( b.code_step = e.code_step )
                    and ( e.date_bilan between :date_debut and :date_fin )
     
        where
            (
                a.date_mois between dateadd(month, -1, :date_debut) and dateadd(month, -1, :date_fin)
            )
     
        group by d.code_unite, d.nom_unite
     
        into
                :CODE_UNITE,
                :NOM_UNITE,
                :FRAIS_TOTAL,
                :MONTANT_FACTURE,
                :VOLUME_MJ_SORTIE,
                :RATIO_EXP_EAU_EPUREE
     
    do
    begin
      suspend;
      end
    end
    Pour tout les mois j'ai le bon résultat mais quand je passe le mois de février en argument j'ai un tableau vide !!! s'agit'il d'un bug ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    :DATE_DEBUT et :DATE_FIN sont bien des TIMESTAMP ?

    Parce que ceci me renvoie un résultat correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATEADD(MONTH, -1, CAST('2012-02-29' AS TIMESTAMP)) FROM RDB$DATABASE
    soit le 29 janv. 2012.



    @+ Claudius

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Salut

    :DATE_DEBUT et :DATE_FIN sont bien des TIMESTAMP ?

    Parce que ceci me renvoie un résultat correct:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATEADD(MONTH, -1, CAST('2012-02-29' AS TIMESTAMP)) FROM RDB$DATABASE
    soit le 29 janv. 2012.



    @+ Claudius
    Merci pour la réponse mon ami.
    à vrai dire c'était des date, je viens de les changer en TimesTamp mais toujours rien !!!! pourtant mes tables sont bien renseignées !!!
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    à vrai dire c'était des date, ...
    Oui quand je disais TIMESTAMP, il peut également s'agir de DATE ou DATETIME.
    Je voulais juste m'assurer que tu manipulais bien une date.

    Sinon je ne vois pas. Et quand tu debug ta procédure, ça donne quoi ?

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Oui quand je disais TIMESTAMP, il peut également s'agir de DATE ou DATETIME.
    Je voulais juste m'assurer que tu manipulais bien une date.

    Sinon je ne vois pas. Et quand tu debug ta procédure, ça donne quoi ?
    ça donne rien et c'est ce qui m'intrigue !
    j'ai une ligne vide mais aucune erreur
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  6. #6
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Alors a priori rien voir avec DateAdd, mais plutôt un jeu de données qui est bancal pour ce mois (cf les INNER JOIN avec les BETWEEN).

    Découpe ta requête 'en petits morceaux' pour voir ce que cela donne.

  7. #7
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Alors a priori rien voir avec DateAdd, mais plutôt un jeu de données qui est bancal pour ce mois (cf les INNER JOIN avec les BETWEEN).

    Découpe ta requête 'en petits morceaux' pour voir ce que cela donne.
    ok je vais voir
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  8. #8
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    je viens de trouver le problème en attendant vos pistes pour une solution. alors voilà, dans mes tables, on a opté pour le dernier jour de chaque mois quand il s'agit d'un champ type date, par exemple, date_mois du bilan c'est toujours le 30, 31, 28 ou 29. avec la fonctions adddate, je me suis aperçu que celle fonctionne réagis mal avec les dates du 30 du mois, elle donne aucun résultat, par contre avec les 31 j'ai toujours le bon compte.

    à mon sens, l'argument month quand il est passé, il retranche pas le mois mais aussi le nombre de jours, ce qui fait qu'il retombe pas sur ma date de saisie.

    donc, il me semble que la solution est de forcer la date pour qu'elle prenne toujours le dernier jour du mois en question ! mais je ne sais comment faire
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    donc, il me semble que la solution est de forcer la date pour qu'elle prenne toujours le dernier jour du mois en question ! mais je ne sais comment faire
    Exemple avec la date du jour. Cela retourne le 1° jour du mois. Pour le dernier je te laisse adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
      DATEADD(DAY, 1 - EXTRACT(DAY FROM CURRENT_DATE), CURRENT_DATE)
    FROM
      RDB$DATABASE

    [Edit] Sinon sous Delphi (si c'est le cas), tu as StartOfAMonth et EndOfAMonth de DateUtils.
    @+ Claudius

  10. #10
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    Exemple avec la date du jour. Cela retourne le 1° jour du mois. Pour le dernier je te laisse adapter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT
      DATEADD(DAY, 1 - EXTRACT(DAY FROM CURRENT_DATE), CURRENT_DATE)
    FROM
      RDB$DATABASE

    [Edit] Sinon sous Delphi (si c'est le cas), tu as StartOfAMonth et EndOfAMonth de DateUtils.
    @+ Claudius
    Re,
    c'est pas ce que je voulais ... mon problème est dans le where, je veux que lorsque je fais (month, -1) je veux me retrouver sur le dernier jour du mois résultant

    Edit : je ne suis pas encore arrivé au stade DELPHI
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 029
    Points : 40 927
    Points
    40 927
    Billets dans le blog
    62
    Par défaut
    je ne sais pas si j'ai tout compris , il s'agit de ce WHERE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       WHERE
            (
                a.date_mois BETWEEN dateadd(month, -1, :date_debut) AND dateadd(month, -1, :date_fin)
            )
    s'il s'agit en fait d'obtenir les mouvements d'un ou plusieurs mois pourquoi ne pas faire un test que sur ce dernier ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       WHERE
            (
                EXTRACT(MONTH,a.date_mois) BETWEEN EXTRACT(MONTH,dateadd(month, -1, :date_debut)) AND EXTRACT(MONTH(dateadd(month, -1, :date_fin))
            )
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 304
    Points
    2 304
    Par défaut
    je crois que je me suis mal fait comprendre
    alors voilà...
    je prends un exemple concret :
    je veux extraire les données relatives au mois d'avril 2012 depuis la table tb_frais_exploitation mais les données relatives au mois de mars 2012 depuis la table tb_energie. et puisque la date dans mes deux tables et du genre "30/04/2012" pour avril et "31/03/2012" pour mars. dans ce cas précis ma requête me retourne un tableau vide alors que les données sont bien présentes dans les deux tables pour les mois correspondants à mon exemple.
    mais si je demande d'extraire les données de juillet depuis la table tb_exploitation et juin de la table tb_energie j'ai bel et bien mon résultat.

    donc j'ai conclu que l'argument month ne retranche pas le mois mais le nombre de jour c'est pourquoi il se retrouve pas dans mes tables puisque les dates ont été saisies le dernier jour de chaque mois.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

Discussions similaires

  1. fonction DATEADD [SQL SERVER]
    Par HULK dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/12/2004, 17h33
  2. Dateadd ????
    Par fdloisel dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/10/2004, 08h28
  3. FONCTIONS GETDATE DATEADD DATEDIFF : URGENT
    Par fleuve007 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/02/2004, 10h35
  4. Pb de date: 28 ou 29 février?
    Par kayser dans le forum ASP
    Réponses: 5
    Dernier message: 03/12/2003, 09h14

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