Problème de dates

Résolu
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005 - 1 déc. 2005 à 13:57
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005 - 16 déc. 2005 à 10:26
Bonjour,

Je dispose d'une table avec les colonnes suivantes :
date_debut, date_fin,montant_facture.

Une facture porte sur la période date_debut à date_fin.

Je recherche le nombre de mois facturés.

Par exemple, j'ai :

01/01/2005 - 15/01/2005
01/02/2005 - 28/02/2005
01/02/2005 - 31/03/2005
01/05/2005 - 31/05/2005

Dans ce cas la requete doit retourner 3,5 mois.

Antilope

8 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
2 déc. 2005 à 11:19
ok... je comprend mieux ton probleme.
et il est plutot complexe...

a premiere vue, je ne vois pas trop comment t'en sortir avec une simple requete.
peut etre que quelqu'un ici aura une idée.

sinon ce que je ferai c'est une procedure stockée de la sorte :

1 - création d'une table temporaire
jJOURS(jour (date), facturation (integer))

2 - tu remplis cette table, avec tous les jours de la plage a couvrir (ici, tous les jours du 01/01/2005 au 31/05/2005), et avec le champs 'facturation' a 0


3 - pour chaque jour de cette table, tu mets le champs facturation a 1 pour tous les jours ayant été facturés, en comparant avec ta table de facturation


4 - tu fais la somme du champs 'facturation' de ta table temporaire.


5 - la tu aura le nombre de jours facturés, reste plus qu'a le convertir en nombre de mois (par exemple diviser par 30,5, ca devrait donner un resultat a peu près correct, tous dépend de la précision que tu veux obtenir, à toi de voir).
3
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
1 déc. 2005 à 15:51
salut

quel SGBDR utilises-tu ?

il existe des fonction toutes faites pour calculer des différences entre deux dates, mais elles differents de l'un a l'autre

exemple pour SQL server, pour recuprer le nombre de jours entre deux dates

DATEDIFF('dd', dateDepart, dateFin)
0
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005
1 déc. 2005 à 15:55
Je travaille sous Oracle.

Il existe effectivement des fonctions pour faire des différences entre 2 dates, mais je n'arrive pas à les utilisé. Dans le cas que je présente, je ne dois pas compter deux fois le mois de Février par exemple, et je ne dois pas compter du tout le mois d'avril.

Antilope
0
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005
5 déc. 2005 à 09:16
Merci, tu m'as donné une bonne idée, qui me servira sans doute dans d'autres projets :

Je vais créer une table calendrier avec toute les dates de l'année et des années avenir. Puis je vais faire une jointure avec cette table. Le resultat me donnera la table temporaire. J'espère qu'en temps de traitement ca va être tolérable .... Mon but final est d'obtenir une moyenne mensuelle du montant facturé pour chaque client, dans le cadre de statistiques donc je ne cherche pas la précision.

Antilope
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005
6 déc. 2005 à 10:11
Ca marche, mais comme je le craignais je suis passée de 20 mn avec un resultat faux à plus d'1 h avec un résultat bon.
Bah .. l'impotant c'est que ce soit bon !

Antilope
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
6 déc. 2005 à 14:09
1 heure ?


comment fais tu ?


met nous le ode si tu veux n peut jeter un oeil


je pense qu'en ajoutant un index bien placé, tu peux aller beaucoup plus vite que ca...


tu as combien de commandes dans ta table ?
0
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005
6 déc. 2005 à 14:15
Ma requête tourne au sein d'un gros PL/SQL qui fait plein d'autres choses et mettait 20 minutes avant mais je comptais plusieurs fois le même mois.

Je vais l'isoler d'abord pour y voir plus clair ...

Antilope
0
cs_Antilope Messages postés 17 Date d'inscription mercredi 4 juin 2003 Statut Membre Dernière intervention 16 décembre 2005
16 déc. 2005 à 10:26
Ca y est, je m'en suis sortie avec une pirouette digne d'un athlète de haut niveau :

Une fois isolée ma requête initiale met 5 mn.

Ma premiere solution était de créer une table contenant toutes les dates puis de faire une jointure avec ma table.
La voici :

select /*+ choose*/ sum(totnb) into wnb from (
select decode(sign(sum(nb)-1),1,1,sum(nb)) totnb,mois from -- on compte au plus 1 par mois
( select distinct mois, months_between(dateFin,dateDepart) nb
from cal_date, factures
where 1=1
and la_date between dateDepart and dateFin
and ... /* restrictions sur factures */
)
group by mois);

En mode rule, la requete met 50 mn ! en choose (c'est un peu mieux) : 30 mn !
Sur une facture le résultat est immédiat et correct, mais sur l'ensemble de l'historique ...aie ... aie ... aie.

J'ai opté pour une autre solution ( résultat 7 mn) :

J'utilise un tableau de 12 cases.

Je parcours les factures de chaque compte via un curseur et pour chacune d'elle j'apelle une procedure
trait(debut,fin) qui remplie les cases( +1 si c'est un mois entier, + un chiffre entre 0 et 1 sinon).
(La premiere case correspond à janvier .. la dernière à décembre).

Si dans une case j'ai plus qu'1 (il y a eu plusieurs factures sur le mois), je compte 1. J'additionne tout ça et voilà ....

Antilope
0
Rejoignez-nous