Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/05/2008, 10h11   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 190
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 190
Points : 67
Points : 67
Par défaut Différence entre 2 dates : déterminer le nombre d'années, mois et jours

bonjour
j'ai besoin de connaitre le nbre des années,mois et jours entre deux dates données j'utilise actuellement la méthode suivante:
Code :
1
2
3
4
 
 x :=trunc((d1-d2)/356) pour avoir le nbre des ans
 m := x*12 - months_between(d2,d1) pour avoir le nbre des mois
 d := trunc(mod(d1-d2,30)) pour avoir le nbre des jours
j'ai le pb avec months_between par exemple
months_between(to_date('01032005','ddmmyyyy'),to_date('31052008','ddmmyyyy'))
donne 2.9 alors qu'en principe j'ai exactement 3 mois avez vous une idée
et merci d'avance
daliok est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2008, 10h52   #2
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
C'est pas terrible de faire des divisions par 356 (d'ailleurs c'est 365 ou 366).

Mieux vaudrait utiliser des calculs sur les années.
Pour le mois, le mois est complet entre le 01/03 00h00 et le 01/04 00h00
Donc c'est normal qu'entre le 01/03 0h00 et le 31/05 0h00, il n'y ait pas 3 mois complet.
Rajoute donc 1 jour (+1 à la date fin) pour le calcul des mois (et des jours aussi).
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2008, 17h53   #3
Membre confirmé
 
Avatar de JerryMouse
 
Homme N'Guessan KOUAME
Inscription : avril 2002
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme N'Guessan KOUAME
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 210
Points : 270
Points : 270
Envoyer un message via MSN à JerryMouse Envoyer un message via Yahoo à JerryMouse
Effectivement, Ajoute 1 à la date de fin.
Pour le nombre de jours Pour le nombre de Mois
Code :
Trunc(Months_Between(D2+1,D1))
Pour le nombre d'années
Code :
Trunc(Months_Between(D2+1,D1)/12)
__________________
Très souvent, le plus difficile est de savoir ce que l'on veut.
JerryMouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 09h42   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
C'est pas vraiment ça qu'il veut :
Il veut x années, y mois et z jours entre 2 dates,
Donc plutôt un modulo qu'un trunc mais je suis pas sur.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2008, 10h01   #5
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
une petite fonction qui, je crois, vient d'ici même peut servir de point de départ...
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
FUNCTION Time_Diff (
                        LD$Date_Deb     IN DATE DEFAULT SYSDATE
	                    ,LD$Date_Fin    IN DATE DEFAULT SYSDATE
                   ) 
    RETURN Varchar2 
IS
	LN$JJ       PLS_INTEGER ;
	LN$HH       PLS_INTEGER ;
	LN$MI       PLS_INTEGER ;
    LN$SS       PLS_INTEGER ;
Begin
 
  IF LD$Date_Fin < LD$Date_Deb Then
     RETURN NULL ;
  End IF ;
 
  SELECT  trunc ( LD$Date_Fin - LD$Date_Deb)  INTO LN$JJ  FROM DUAL ;
  SELECT  trunc ( (LD$Date_Fin - LD$Date_Deb) * 24) -  ( LN$JJ * 24 ) INTO LN$HH FROM DUAL ;
  SELECT  trunc ( (LD$Date_Fin - LD$Date_Deb) * 1440) - ( (LN$HH * 60) + ( LN$JJ * 1440) ) INTO LN$MI FROM DUAL ;
  SELECT  trunc ( (LD$Date_Fin - LD$Date_Deb) * 86400) - ( (LN$MI * 60) + (LN$HH * 3600) + ( LN$JJ * 3600 * 24 ) ) INTO LN$SS FROM DUAL ;
 
  RETURN( LN$JJ||' Jour(s), '||LN$HH||' Heure(s), '||LN$MI||' Minute(s), '||LN$SS||' Seconde(s)' ) ;
 
End Time_Diff ;
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2008, 15h28   #6
Membre confirmé
 
Avatar de JerryMouse
 
Homme N'Guessan KOUAME
Inscription : avril 2002
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme N'Guessan KOUAME
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 210
Points : 270
Points : 270
Envoyer un message via MSN à JerryMouse Envoyer un message via Yahoo à JerryMouse
Voici un code qui peut aider:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
declare
  dat2 Date := sysdate;
  dat1 Date := to_date('01012000','DDMMYYYY');
  Jour Number;
  Nomb Number;
  Annee Number;
  Mois Number;
Begin
  Nomb := Months_Between(Dat2, Dat1);
  Annee := Trunc( Nomb/12);
  Mois := Trunc(Nomb-Annee*12);
  Jour := Trunc((Nomb - Trunc( Nomb))*30);
  Dbms_Output.Put_Line( ANNEE ||' an(s) '|| Mois ||' mois '||Jour||' jour(s).');
End;
__________________
Très souvent, le plus difficile est de savoir ce que l'on veut.
JerryMouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h22.


 
 
 
 
Partenaires

Hébergement Web