Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 24/01/2007, 10h57   #1
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 152
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 152
Points : 28
Points : 28
Envoyer un message via ICQ à 18Marie Envoyer un message via AIM à 18Marie Envoyer un message via MSN à 18Marie
Par défaut Comparer 2 dates sous PL/SQL

Salut,


J'arrive pas à faire la difference entre 2 dates, le problème est que:
J'ai une procedure stockée avec une paramètre en entréee qui est une date et dans la procedure je dois verifier si la date d'entrée est plus grande que les dates dans une table alors j'ai fait (date d'entréee - date dans la table )mais ce qui est bizard que qd j'entre la meme date, il affiche pas 0....
Comment on fait pour comparer 2 dates, sous Oracle

Merci,
18Marie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 11h05   #2
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
salut,
il ne faut pas oublier que les dates contiennent également l'heure (et minutes, et secondes, ...)

alors si tu veux ne comparer que le JOUR, utilise la fonction TRUNC sur chacune de tes dates à comparer pour ramener toutes le heures, minutes, etc... à 0
Code :
SELECT trunc(sysdate) - trunc(sysdate) FROM dual
remène effectivement 0
__________________
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 25/01/2007, 09h31   #3
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 152
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 152
Points : 28
Points : 28
Envoyer un message via ICQ à 18Marie Envoyer un message via AIM à 18Marie Envoyer un message via MSN à 18Marie
Merci pour la réponse, ce que je comprends que sous Oracle il y a pas de fontions pour comparer les dates que faire la soustraction.
18Marie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 09h37   #4
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Citation:
Envoyé par 18Marie
ce que je comprends que sous Oracle il y a pas de fontions pour comparer les dates que faire la soustraction.

???? Pourquoi tu dis ça ?

Sous Oracle tu peux comparer des dates avec =, >, <, etc et en plus tu peux soustraire des dates ce qui te donne un nombre de jour.

Ce que Yorglaa te dis c'est qu'il faut faire attention quand tu compares des dates car le format interne est en realité DATETIME et donc si tu fais un test d'égalité deux dates ne sont égales que si elles sont exactement égales à la seconde pres ! D'ou le TRUNC pour arrondir a la journée pres.
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 09h46   #5
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Ce qu'elle voudrait à mon avis ce sont des fonctions tout faites du style : GET_NB_DAY(DATE_DEBUT, DATE_FIN) qui calculerait le nombre de jour entre les 2 dates fournies en paramètre, etc.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 09h59   #6
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Et bien si c'est cela une simple soustraction le fait directement. Pas besoins de fonction. Le resultat est en jours avec eventuellement un partie decimale.

Par exemple 02/01/2007 12:00 - 01/01/2007 00:00 donnera 1,5 soit un jour et 12heures
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 14h56   #7
Nouveau Membre du Club
 
Inscription : mars 2006
Messages : 152
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 152
Points : 28
Points : 28
Envoyer un message via ICQ à 18Marie Envoyer un message via AIM à 18Marie Envoyer un message via MSN à 18Marie
Merci pour vos aides,
C vraiment ce que je cherche ce sont des fonctions dèjà faits....

Quand on compare 2 dates avec <,>, est-que les 2 dates doivent etre de type date car moi j'ai 2 dates dont le premier est de type Date et le deuxieme de type String et ca marche alors, je ne sais pas si par hazard que ca fonctionne ???

Merci
18Marie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 15h08   #8
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Tu n'as pas peur ! ! ! !

Il ne faut jamais comparer des choux et des carrotes.

Si ca marche c'est qu'Oracle fait une conversion implicite et dans ce cas je suis bien incapable de savoir si il decide de convertir ton string en date ou ta date en string.

Tu as donc une chance sur deux qu'il ne fasse pas ce que tu veux. Comme je ne suis pas joueur, je preferes toujousr faire une conversion explicite (avec un to_date) et maitriser ce qui se passe plutot que de laisser Oracle faire ce qu'il veut.

J'irais meme plus loin il faut faire un to_date en precisant le format de conversion parce que c'est pas pcq aujourd'hui ta date en string est dans le format date par defaut qu'un jour cela le changera pas.
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 16h34   #9
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Je suis entièrement avec Wurlitzer, en particulier avec la spécification explicite du format.
En effet, par expérience, je pense qu'il vaut mieux que le programme plante quitte à avoir une ORA-xxx plutôt qu'il fasse des calculs qui ne sont absolument pas ceux attendus (entre autres parce que les données ont été converties dans un autre format que celui souhaité).

Un développeur(se) avertit en vaut 2, non ?
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 15h49   #10
Futur Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 17
Points : 17
bonjours j'écrit ici car mon probleme est sensiblement le meme que celui evoqué.

voila je fait un programme PL/SQL dans lequel je compare deux dates la premiere et recupéré dans un curseur et la seconde est celle du systeme (sysdate) à laquelle je retranche un nombre de jours qui et un number passé en parrametre de la procedure.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
begin
    open cur;
    FOR varcur IN cur loop
        IF (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) ||
            trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))
    then
        INSERT INTO archive VALUES (varcur.num_client,varcur.nom_client,
                varcur.prenom, varcur.num_reservation, varcur.num_hotel,
                varcur.nb_cl_invite, varcur.nb_enfant_invit,
                varcur.Date_deb_Reserv, varcur.date_annulation);
        end IF;
    end loop;
end;
losque je créé ma procedure j'ai les erreurs suivantes :

26/44 PLS-00103: Encountered the symbol "<" when expecting one of the
following:
. ( ) , * % & - + / at mod remainder rem <an exponent (**)>
and or ||
The symbol ")" was substituted for "<" to continue.

26/73 PLS-00103: Encountered the symbol ")" when expecting one of the
following:
* & - + / at mod remainder rem then <an exponent (**)> and or
|| multiset year DAY_


pour info "cur" est mon curseur.Et la ligne 26 est "if (trunc ..."

quelqu'un peut il m'éclairer??
Ogtraba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 17h31   #11
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Code :
1
2
3
 
IF (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) ||
            trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))
A la place il faut mettre
Code :
1
2
3
 
IF (trunc (varcur.date_deb_reserv) < (trunc(sysdate) - NbJours) AND 
            trunc (varcur.date_annulation) < (trunc (sysdate) - NbJours)))
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2007, 17h46   #12
Futur Membre du Club
 
Inscription : décembre 2006
Messages : 65
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 65
Points : 17
Points : 17
merci beaucoup
Ogtraba est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 09h47   #13
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Le || c'est un OR non ?
le && c'est un AND
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 10h09   #14
Membre du Club
 
Inscription : août 2004
Messages : 36
Détails du profil
Informations personnelles :
Âge : 38
Localisation : France

Informations forums :
Inscription : août 2004
Messages : 36
Points : 41
Points : 41
Citation:
Envoyé par McM
Le || c'est un OR non ?
le && c'est un AND
Effectivement ...
iron_c est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 15h39   #15
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Code :
1
2
3
4
5
6
7
8
9
 
 CREATE OR REPLACE FUNCTION  pp RETURN date IS
 begin
 IF (trunc (to_date('2007-03-01','yyyy-mm-dd')) < (trunc(sysdate)- 3) ||
    trunc (to_date('2007-03-01','yyyy-mm-dd')) < (trunc (sysdate) - 3) ) then
 RETURN sysdate ;
 end IF;
 end ;
 /
Tu auras l'erreur suivante
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SP2-0317: nom de symbole absent
 
Avertissement : Fonction créée avec erreurs de compilation.
 
SQL> SHOW errors ;
Erreurs pour FUNCTION PP :
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/69     PLS-00103: Symbole "&" rencontré à la place d'un des symboles
         suivants :
         ) , * & - + / at mod remainder rem <exposant (**)> and or ||
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 16h20   #16
Membre éclairé
 
Avatar de Wurlitzer
 
Inscription : avril 2006
Messages : 465
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 465
Points : 368
Points : 368
Citation:
Envoyé par McM
Le || c'est un OR non ?
le && c'est un AND

Euh vous parlez quelle langue ? en C ok mais en PL/SQL il faut employer OR et AND
Wurlitzer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 17h39   #17
Responsable Business Intelligence
 
Avatar de kalyparker
 
Femme
Consultant en Business Intelligence
Inscription : janvier 2007
Messages : 1 192
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : janvier 2007
Messages : 1 192
Points : 2 564
Points : 2 564
D'accord avec Wurlitzer, à part la concaténation de 2 champs avec ||, je ne vois pas d'autre utilisation en pl/sql de || et de &&.
kalyparker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/03/2007, 18h09   #18
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 450
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 450
Points : 4 209
Points : 4 209
Bien sur je parlais des autres langages de programmation (C, Php, ...)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM 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 00h39.


 
 
 
 
Partenaires

Hébergement Web