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 :

Utilisation de REGEXP_SUBSTR [12c]


Sujet :

SQL Oracle

  1. #1
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut Utilisation de REGEXP_SUBSTR
    Bonjour à tous,

    Je m'arrache les cheveux avec les expressions régulières..

    Ce que je cherche à faire, créer une fonction qui, à partir d'un temps d'ouverture, en ressort le nombre de jour, l'heure de début et l'heure de fin (en Varchar2).

    Je m'explique, avec une chaîne de caractère du style : 5/7 7h30-20h
    je veux obtenir le 5 (pour 5 jours), 07:30 pour l'heure de début et enfin 20:00 de l'heure de fin.

    ou alors :

    avec une chaîne de caractère du style : 5/7 7h-20h
    je veux obtenir le 5 (pour 5 jours), 07:00 pour l'heure de début et enfin 20:00 de l'heure de fin.

    J'ai même comme valeur 24/7 qui se transformerait dans les valeurs 7 pour le jour, 00:00 pour l'heure de début et 23:59 pour l'heure de fin.

    C'est possible de faire tout ça ?

    Merci d'avance

    Michel

  2. #2
    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
    Pas en une seule expression mais ça peut déjà donner une piste :
    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
    with cte_prep (id, col, deb, fin) as
    (
    select id, col
         , '0' || regexp_substr(col, '[[:digit:]]{1,2}h[[:digit:]]{0,2}', 1, 1) || '00' end
         , '0' || regexp_substr(col, '[[:digit:]]{1,2}h[[:digit:]]{0,2}', 1, 2) || '00' end
      from (values (1, '5/7 7h30-20h')
                 , (2, '5/7 7h-20h'  )
                 , (3, '24/7'        )
                 , (4, '7/7 10h-18h' )
                 , (5, '3/7 4h-8h45' )) t (id, col)
    )
    select id, col
         , case col when '24/7' then '7'     else substr(col, 1, 1) end as jour
         , case col when '24/7' then '00:00' else substr(deb, instr(deb, 'h')-2, 2) || ':' || substr(deb, instr(deb, 'h')+1, 2) end as deb
         , case col when '24/7' then '23:59' else substr(fin, instr(fin, 'h')-2, 2) || ':' || substr(fin, instr(fin, 'h')+1, 2) end as fin
      from cte_prep;
     
     
    ID  COL           JOUR  DEB    FIN
    --  ------------  ----  -----  -----
     1  5/7 7h30-20h     5  07:30  20:00
     2  5/7 7h-20h       5  07:00  20:00
     3  24/7             7  00:00  23:59
     4  7/7 10h-18h      7  10:00  18:00
     5  3/7 4h-8h45      3  04:00  08:45

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    REGEXP_SUBSTR pour extraire, puis des fonctions de conversion pour la mise en forme. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select horaire,  
           least(to_number(regexp_substr(horaire, '[^/]+')), 7) jour,
           nvl(to_char(to_date(trim(regexp_substr(horaire, ' [^h][^-]+')), 'hh24"h"mi'), 'hh24:mi'), '00:00') debut,
           nvl(to_char(to_date(regexp_substr(horaire, '[^-]+', 1, 2), 'hh24"h"mi'), 'hh24:mi'), '23:59') fin
    from v;

  4. #4
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pas en une seule expression mais ça peut déjà donner une piste :
    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
    with cte_prep (id, col, deb, fin) as
    (
    select id, col
         , '0' || regexp_substr(col, '[[:digit:]]{1,2}h[[:digit:]]{0,2}', 1, 1) || '00' end
         , '0' || regexp_substr(col, '[[:digit:]]{1,2}h[[:digit:]]{0,2}', 1, 2) || '00' end
      from (values (1, '5/7 7h30-20h')
                 , (2, '5/7 7h-20h'  )
                 , (3, '24/7'        )
                 , (4, '7/7 10h-18h' )
                 , (5, '3/7 4h-8h45' )) t (id, col)
    )
    select id, col
         , case col when '24/7' then '7'     else substr(col, 1, 1) end as jour
         , case col when '24/7' then '00:00' else substr(deb, instr(deb, 'h')-2, 2) || ':' || substr(deb, instr(deb, 'h')+1, 2) end as deb
         , case col when '24/7' then '23:59' else substr(fin, instr(fin, 'h')-2, 2) || ':' || substr(fin, instr(fin, 'h')+1, 2) end as fin
      from cte_prep;
     
     
    ID  COL           JOUR  DEB    FIN
    --  ------------  ----  -----  -----
     1  5/7 7h30-20h     5  07:30  20:00
     2  5/7 7h-20h       5  07:00  20:00
     3  24/7             7  00:00  23:59
     4  7/7 10h-18h      7  10:00  18:00
     5  3/7 4h-8h45      3  04:00  08:45
    Merci Waldar, mais par contre, je ne comprends pas trop comment ça fonctionne, j'ai un message qui me dit qu'il ne connais pas la table nommée 'values'

  5. #5
    Membre régulier Avatar de Michel38
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2005
    Messages : 218
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    REGEXP_SUBSTR pour extraire, puis des fonctions de conversion pour la mise en forme. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select horaire,  
           least(to_number(regexp_substr(horaire, '[^/]+')), 7) jour,
           nvl(to_char(to_date(trim(regexp_substr(horaire, ' [^h][^-]+')), 'hh24"h"mi'), 'hh24:mi'), '00:00') debut,
           nvl(to_char(to_date(regexp_substr(horaire, '[^-]+', 1, 2), 'hh24"h"mi'), 'hh24:mi'), '23:59') fin
    from v;
    Merci Vanagreg, Ca marche super bien.

    Michel

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

Discussions similaires

  1. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  2. Réponses: 5
    Dernier message: 11/06/2002, 15h21
  3. Réponses: 4
    Dernier message: 05/06/2002, 14h35
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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