Précédent   Forum du club des développeurs et IT Pro > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/05/2012, 11h04   #1
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 11h16   #2
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 978
Points : 9 978
Salut

:DATE_DEBUT et :DATE_FIN sont bien des TIMESTAMP ?

Parce que ceci me renvoie un résultat correct:
Code :
SELECT DATEADD(MONTH, -1, CAST('2012-02-29' AS TIMESTAMP)) FROM RDB$DATABASE
soit le 29 janv. 2012.



@+ Claudius
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 11h27   #3
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 11h57   #4
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 978
Points : 9 978
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 ?
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 12h13   #5
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 12h40   #6
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 978
Points : 9 978
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.
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 12h43   #7
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 15h02   #8
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 16h02   #9
Cl@udius
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 860
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 50
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 860
Points : 9 978
Points : 9 978
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 :
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
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2012, 16h34   #10
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2012, 08h06   #11
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 206
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 206
Points : 7 261
Points : 7 261
je ne sais pas si j'ai tout compris , il s'agit de ce WHERE ?
Code :
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 :
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))
        )
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2012, 15h56   #12
Just-Soft
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 2 048
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 2 048
Points : 2 148
Points : 2 148
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h18.


 
 
 
 
Partenaires

Hébergement Web