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

SQL Oracle Discussion :

erreur lors de la conversion Integer <=> date


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut erreur lors de la conversion Integer <=> date
    Bonjour a tous,
    Grace a votre aide lors d'une précedente discussion, j'ai réussi à convertir un integer en date dans une requète. Sa a marché et lorsque j'ai réexecuté ma requète sa me renvoit une erreur, apparament car la table contient des nombre trop grands:

    voici ma requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select blabla,
                       to_char(to_date(maTable.MonChamp,'SSSSS'),'HH24:MI:SS')        as DURATION,
                       blabla
                       from....where....;
    cette requête me revois une erreur: Error ORA-00900: invalid SQL statement
    Si j'enlève la ligne de convèrsion cette requète fonctionne (mais ne me sert plus à rien )
    j'ai extrait la ligne dans une autre requete comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select to_char(to_date(MonChamps,'SSSSS'),'HH24:MI:SS') 
        from MaTable
    et il me renvois cette erreur: ORA-01853: seconds in day must be between 0 and 86399, j'ai essayé de changé HH24 en HH, rien n'y fait. Je suis obligé d'avoir des données avec des integer superieur à 86399 dans ma table et j'aimerais qu'il me les convertissent (en continuant 25h, 27h...). mon temps ne tient aucun compte des journée calendaires.
    y'a-t-il un moyen de faire cela?
    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> select to_char(to_date('23:59:59','HH24:MI:SS'),'SSSSS') from dual
      2  /
     
    TO_CH
    -----
    86399
     
    SQL>
    Le format "SSSSS" donne le nombre de secondes écoulées du jour depuis la première seconde du matin. Il ne peut donc dépasser une valeur limite.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avec un peu de maths :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    With tst as
    (
    select 1 as nm from dual union all
    select 59      from dual union all
    select 60      from dual union all
    select 119     from dual union all
    select 120     from dual union all
    select 3599    from dual union all
    select 3600    from dual union all
    select 86399   from dual union all
    select 86400   from dual union all
    select 86401   from dual union all
    select 863999  from dual union all
    select 864000  from dual union all
    select 864001  from dual
    )
    select nm,
           trunc(nm/3600)            as heures,
           trunc(mod(nm, 3600) / 60) as minutes,
           mod(nm, 60)               as secondes
      from tst;
     
    NM	HEURES	MINUTES	SECONDES
    1	0	0	1
    59	0	0	59
    60	0	1	0
    119	0	1	59
    120	0	2	0
    3599	0	59	59
    3600	1	0	0
    86399	23	59	59
    86400	24	0	0
    86401	24	0	1
    863999	239	59	59
    864000	240	0	0
    864001	240	0	1

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    merci pour ta réponse Waldar, ta formule fonctionne en théorie mais pas dans mon cas car malheureusement et pour des problèmes propres a mon projet je dois pouvoir récupérer le résultat dans un seul champs (d'où l'interet de la formule précedament utilisé). n'existe-il pas un format semblable a SSSSS mais qui serrait plus "souple"?

  5. #5
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par dirty_harry Voir le message
    merci pour ta réponse Waldar, ta formule fonctionne en théorie mais pas dans mon cas car malheureusement et pour des problèmes propres a mon projet je dois pouvoir récupérer le résultat dans un seul champs (d'où l'interet de la formule précedament utilisé). n'existe-il pas un format semblable a SSSSS mais qui serrait plus "souple"?
    Il n'y pas de format "plus souple". Mais, vous pouvez concaténer par vous même les résultats pour afficher ce que vous voulez, to_char étant simplement une fonction de conversion d'une date vers une chaîne de caractères.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Comme le dit mnitu il suffit ensuite de concaténer les résultats :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    With tst as
    (
    select 1 as nm from dual union all
    select 59      from dual union all
    select 60      from dual union all
    select 119     from dual union all
    select 120     from dual union all
    select 3599    from dual union all
    select 3600    from dual union all
    select 86399   from dual union all
    select 86400   from dual union all
    select 86401   from dual union all
    select 863999  from dual union all
    select 864000  from dual union all
    select 864001  from dual
    )
    select nm,
           to_char(trunc(nm/3600), 'FM999999900')     || ':' ||
           to_char(trunc(mod(nm, 3600) / 60), 'FM00') || ':' ||
           to_char(mod(nm, 60), 'FM00') as res
      from tst;
     
    NM	RES
    1	00:00:01
    59	00:00:59
    60	00:01:00
    119	00:01:59
    120	00:02:00
    3599	00:59:59
    3600	01:00:00
    86399	23:59:59
    86400	24:00:00
    86401	24:00:01
    863999	239:59:59
    864000	240:00:00
    864001	240:00:01

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2009
    Messages : 176
    Points : 118
    Points
    118
    Par défaut
    Merci pour toutes vos réponses, elles m'ont permis d'être débloqué mais je retrouve quand même un petit problême: en alliant les formules mathématique et la concaténation cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select trunc(prt.OUTTHPUT_PROTIME/3600) || ':' ||trunc(mod(prt.OUTTHPUT_PROTIME, 3600) / 60) || ':' ||  mod(prt.OUTTHPUT_PROTIME , 60)
    cette formule fonctionne du point de vue mathématique et 'presque' du point de vue de la mise en page car j'ai maintenant des résultat de la forme:
    1:4:12
    1:10:12
    21:2:4
    franchemant pour des heures c'est pas terribles trrible, dois-je utiliser les case (si <10 on rajoute un 0 devant) ou peut on automatiquement génerer un affichage a deux chiffre?
    merci beaucoup de votre aide.

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Voir le post juste au-dessus du votre, c'est géré.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur lors de la conversion Excel vers kml
    Par ammourabizerte dans le forum Langage
    Réponses: 1
    Dernier message: 05/03/2013, 10h51
  2. Erreur lors de la conversion d'une requête SELECT en DELETE
    Par SamLeChiseuji dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 11/07/2007, 15h09
  3. Erreur lors de la conversion de MyISSAM vers InnoDB
    Par faico dans le forum Requêtes
    Réponses: 12
    Dernier message: 26/08/2006, 22h25
  4. Réponses: 2
    Dernier message: 21/06/2004, 15h55

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