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

Oracle Discussion :

Pourquoi le code ora-01861 ?


Sujet :

Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut Pourquoi le code ora-01861 ?
    Bonjour à toutes et à tous,

    Je n'arrive pas à trouver la solution, je fais un blocage

    Je cherche à connaître les nouveaux joueurs à une date, dans l'exemple le 27032007. Les joueurs ne doivent donc pas exister avant le 27032007 !

    Avec d'autres requêtes du style where date like '%20070327%', cela fonctionne correctement et ici non ?

    De plus il faudrait que je puisse saisir une date sous la forme DDMMYYYY et que cela fonctionne malgré le format de jdaval dans la bae YYYYMMDD.


    Les variables :

    nomutilisateur = dupont8976
    ladate = date (dans la base sous la forme YYYYMMDD)


    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
     
    SQL> SET LINESIZE 150
    SQL> SET PAGESIZE 150
    SQL> select D1.nomutilisateur,D1.date,
      2  count(distinct D1.nomutilisateur) over()
      3  FROM tm1genval D1
      4  where ladate >=to_date('20070327','YYYYMMDD')
      5  AND ladate <to_date('20070327','YYYYMMDD')+1
      6  AND NOT EXISTS (select 1 from tm1genval D2
      7  WHERE D2.nomutilisateur=D1.nomutilisateur 
      8  AND ladate < to_date('20070327','YYYYMMDD'));
    where ladate >=to_date('20070327','YYYYMMDD')
          *
    ERROR at line 4:
    ORA-01861: literal does not match format string
    Merci encore pour votre aide.

    Cordialement.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Le nom "date" est réservé non ?
    essaye de mettre l'alias de la table devant.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Non, en fait faut mettre d."date"

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par McM
    Non, en fait faut mettre d."date"
    Le problème ne vient pas de date, j'ai changer la variable en ladate, j'ai toujours ERROR ORA-1861.

    Qui va donc trouver la solution ?

    Merci pour votre aide.

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Est ce que ton champs ladate est obligatoire ( not null)?

    Si c'est facultatif rajoute dans ton code ladate is not null

    J'ai trouvé cet article sur Metalink
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Description
     
     
    Implicit data conversion from null terminated string host variable 
    to date, results in ORA-1861 'literal does not match format string'
    if the table is locked.

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pfff.. j'avais pas lu en entier la question posée :
    ladate = date (dans la base sous la forme YYYYMMDD)
    et
    Avec d'autres requêtes du style where date like '%20070327%', cela fonctionne correctement
    C'est quoi le type du champ ladate ? VARCHAR2 ou DATE ??

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par salim11
    Salut,

    Est ce que ton champs ladate est obligatoire ( not null)?

    Si c'est facultatif rajoute dans ton code ladate is not null

    J'ai trouvé cet article sur Metalink
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Description
     
     
    Implicit data conversion from null terminated string host variable 
    to date, results in ORA-1861 'literal does not match format string'
    if the table is locked.
    Salut et merci pour ton aide,

    le champs dans ma base pour ladate is not null. Donc il y a obligatoirement une date.

    Comment peut-on faire d'après vous ?

  8. #8
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Quand tu fais un select , quel est le format du champs ladate (yyyymmdd)?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT  distinct ladate 
         FROM tm1genval D1

  9. #9
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Tu peux poster le script de création de ta table tm1genval ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par McM
    Pfff.. j'avais pas lu en entier la question posée :


    C'est quoi le type du champ ladate ? VARCHAR2 ou DATE ??
    C'est plus que sympa votre aide !

    Je viens de vérifier, le champ ladate est du type varchar2(10) et non pas date !

    C'est pour cette raison que cela ne fonctionne pas ?

    Comment peut-on faire alors ??

    Merci à vous.

  11. #11
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Il faut le convertir aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT D1.nomutilisateur,D1.date,
      2  count(DISTINCT D1.nomutilisateur) over()
      3  FROM tm1genval D1
      4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
      5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
      6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
      7  WHERE D2.nomutilisateur=D1.nomutilisateur 
      8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))
    mais pourquoi pas varchar2(8)tu as le format 'YYYYMMDD'?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par salim11
    Salut,

    Il faut le convertir aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT D1.nomutilisateur,D1.date,
      2  count(DISTINCT D1.nomutilisateur) over()
      3  FROM tm1genval D1
      4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
      5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
      6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
      7  WHERE D2.nomutilisateur=D1.nomutilisateur 
      8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))
    mais pourquoi pas varchar2(8)tu as le format 'YYYYMMDD'?

    Super cela fonctionne à un détail prés, j'ai bien le résultat mais par contre il m'indique 129 enregistrements en m'indiquant plusieurs fois par exemple le même utilisateur pour la même journée donc cela fait pour la date du 20070327
    129 enregistrements, alors qu'il devrait me dire et me présenter à l'écran que 19 nouveaux utilisateurs au 20070327, ils n'existaient pas avant, nous sommes bien d'accord !

    Si tu peux trouver la solution, tu es vraiment un "client" en oracle, bravo et merci.

    Pour le vachar2(10), je sais c'est bizarre, mais je ne connais pas les responsables

  13. #13
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par salim11
    Salut,

    Il faut le convertir aussi
    Ben non justement faut pas le convertir vu que c'est du YYYYMMDD c'est trié.
    Faut le convertir si tu dois faire des calculs de date (genre le +1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT D1.nomutilisateur,D1.date,
        count(DISTINCT D1.nomutilisateur) over()
        FROM tm1genval D1
        WHERE SUBSTR(ladate,1,8) =  '20070327'  
        AND NOT EXISTS (SELECT 1 FROM tm1genval D2
        WHERE D2.nomutilisateur=D1.nomutilisateur 
        AND ladate < '20070327')
    c'est con d'avoir du VCHR(10), ce serait 8 comme le dit Salim, tu peux alors t'affranchir du SUBSTR et donc avoir un index utilisé( ou alors si tu es sur que les données seront toujours de length 8, pas de substr)
    Dans ce cas je préconise un alter table pour repasser en VARCHAR2(8)

  14. #14
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    salut,
    rajoute un Distinct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT  distinct D1.nomutilisateur,D1.date,
      2  count(DISTINCT D1.nomutilisateur) over()
      3  FROM tm1genval D1
      4  WHERE to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
      5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
      6  AND NOT EXISTS (SELECT 1 FROM tm1genval D2
      7  WHERE D2.nomutilisateur=D1.nomutilisateur 
      8  AND to_date(ladate ,'YYYYMMDD')< to_date('20070327','YYYYMMDD'))

  15. #15
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut ,

    Oui c'est vrai pourquoi ce code pour selectionner une journée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
      5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
    Tu as raison MCM , des fois je voix pas bien

  16. #16
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT D1.nomutilisateur, 
    	   '20070327' AS ladate, 
    	   COUNT(DISTINCT D1.nomutilisateur) over()
    FROM tm1genval D1
    WHERE ladate = '20070327'
    AND NOT EXISTS (SELECT 1 
    		FROM tm1genval D2
    		WHERE D2.nomutilisateur = D1.nomutilisateur 
    		AND ladate < '20070327')
    GROUP BY D1.nomutilisateur

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par salim11
    Salut ,

    Oui c'est vrai pourquoi ce code pour selectionner une journée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    to_date(ladate ,'YYYYMMDD') >=to_date('20070327','YYYYMMDD')
      5  AND to_date(ladate ,'YYYYMMDD')<to_date('20070327','YYYYMMDD')+1
    Tu as raison MCM , des fois je voix pas bien
    Merci pour votre aide Messieurs, j'avais un grand besoin d'experts.

    Je ne peux pas tester, il faudra attendre lundi

    Concernant la deuxième ligne c'est pour faire pour une tranche de date !

    Bon week-end à vous

    Je ferme le sujet si cela tourne lundi

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par McM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT D1.nomutilisateur, 
    	   '20070327' AS ladate, 
    	   COUNT(DISTINCT D1.nomutilisateur) over()
    FROM tm1genval D1
    WHERE ladate = '20070327'
    AND NOT EXISTS (SELECT 1 
    		FROM tm1genval D2
    		WHERE D2.nomutilisateur = D1.nomutilisateur 
    		AND ladate < '20070327')
    GROUP BY D1.nomutilisateur

    Salut à tous,

    Je viens de "tester" le script sql (ci-dessus), il est parfait , Grandissimo !

    Lorsque les "experts" sont dans le coin, cela se voit

    Un grand merci à vous pour votre aide.

    Allez pour la route, je sais que vous êtes "chaud", si je veux faire la même chose mais pour une tranche de date (exemple les nouveaux du 20070327 au 20070330) inclus, je modifie comment le code ? afin que je ne fasse pas une bétisse.

    Bonne journée les "pros".

    Cordialement.

  19. #19
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Tant que tu n'as pas de calcul sur les date (du genre du 20070327 au 20070327 + 7 jours), tu peux continuer à garder ce format.
    Bien sur faut modifier le groupement vu que tu auras plusieurs dates (enfin ça dépend de ce que tu veux en sortie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT nomutilisateur, 
    	   ladate, 
    	   COUNT(DISTINCT nomutilisateur) over()
    FROM tm1genval D1
    WHERE ladate NETWEEN '20070327' AND '20070330'
    AND NOT EXISTS (SELECT 1 
    		FROM tm1genval D2
    		WHERE D2.nomutilisateur = D1.nomutilisateur 
    		AND ladate < '20070327')
    GROUP BY nomutilisateur, ladate

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 98
    Par défaut
    Citation Envoyé par McM
    Tant que tu n'as pas de calcul sur les date (du genre du 20070327 au 20070327 + 7 jours), tu peux continuer à garder ce format.
    Bien sur faut modifier le groupement vu que tu auras plusieurs dates (enfin ça dépend de ce que tu veux en sortie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT nomutilisateur, 
    	   ladate, 
    	   COUNT(DISTINCT nomutilisateur) over()
    FROM tm1genval D1
    WHERE ladate NETWEEN '20070327' AND '20070330'
    AND NOT EXISTS (SELECT 1 
    		FROM tm1genval D2
    		WHERE D2.nomutilisateur = D1.nomutilisateur 
    		AND ladate < '20070327')
    GROUP BY nomutilisateur, ladate

    Cela fonctionne parfaitement bien

    McM, tu es le roi d'oracle , je te remercie vraiement beaucoup pour ton aide.

    Quel chance de t'avoir trouvé sur la route de la connaissance !

    Cordialement

    Bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 12h44
  2. Réponses: 2
    Dernier message: 31/07/2006, 08h48
  3. ERREUR ORA-01861
    Par claralavraie dans le forum Oracle
    Réponses: 3
    Dernier message: 04/01/2006, 17h01
  4. Pourquoi ce code marche pas sous FF?
    Par Death83 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/09/2005, 10h04
  5. Réponses: 11
    Dernier message: 08/10/2004, 15h12

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