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 :

Calcul sur des dates au format hybride


Sujet :

SQL Oracle

  1. #1
    Invité
    Invité(e)
    Par défaut Calcul sur des dates au format hybride
    Bonjour,

    Je vais la faire simple . J'ai une BDD avec un champ "date " qui est surtout numérique. En somme la BDD oracle a été monté avec une chaine à ce format de type varchar : AAAAMMJJ.

    Voici la conversion que je fais :

    Code sql oracle : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select to_date(substr(chaine_AAAAMMJJ,7,2)||'/'||substr(chaine_AAAAMMJJ,5,2)||'/'||substr(chaine_AAAAMMJJ,1,4)) as date_europ 
    from matable
    where chaine_AAAAMMJJ not like '%9999%'
    and chaine_AAAAMMJJ is not null
    and chaine_AAAAMMJJ != 0
    and substr(chaine_AAAAMMJJ,7,2) not like '00'
    and substr(chaine_AAAAMMJJ,5,2) not like '00'
    and substr(chaine_AAAAMMJJ,7,2) between 01 and 31
    and substr(chaine_AAAAMMJJ,5,2) between 01 and 12
    and substr(chaine_AAAAMMJJ,1,4) > 1900 ;

    Problème lors de l'affichage de la date je me retrouve avec 11/03/19 au lieu de 11/03/2019 . Pourtant je force bien sur substr(chaine_AAAAMMJJ,1,4) .

    A noter je dois pouvoir faire un calcul de la sorte :

    Code sql oracle : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select ('11/03/2018'-(to_date(substr(chaine_AAAAMMJJ,7,2)||'/'||substr(chaine_AAAAMMJJ,5,2)||'/'||substr(chaine_AAAAMMJJ,1,4)))) as difference 
    from matable
    where chaine_AAAAMMJJ not like '%9999%'
    and chaine_AAAAMMJJ is not null
    and chaine_AAAAMMJJ != 0
    and substr(chaine_AAAAMMJJ,7,2) not like '00'
    and substr(chaine_AAAAMMJJ,5,2) not like '00'
    and substr(chaine_AAAAMMJJ,7,2) between 01 and 31
    and substr(chaine_AAAAMMJJ,5,2) between 01 and 12
    and substr(chaine_AAAAMMJJ,1,4) > 1900 ;

    Merci de m'aiguiller

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Et si, pour le résultat qui te pose pb, tu affichais aussi chaine_AAAAMMJJ, on y verrait peut-être plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select chaine_AAAAMMJJ, to_date(substr(chaine_AAAAMMJJ,7,2)||'/'||substr(chaine_AAAAMMJJ,5,2)||'/'||substr(chaine_AAAAMMJJ,1,4)) as date_europ 
    from matable
    where chaine_AAAAMMJJ not like '%9999%'
    and chaine_AAAAMMJJ is not null
    and chaine_AAAAMMJJ != 0
    and substr(chaine_AAAAMMJJ,7,2) not like '00'
    and substr(chaine_AAAAMMJJ,5,2) not like '00'
    and substr(chaine_AAAAMMJJ,7,2) between 01 and 31
    and substr(chaine_AAAAMMJJ,5,2) between 01 and 12
    and substr(chaine_AAAAMMJJ,1,4) > 1900 ;
    Que veux-tu dire par "J'ai une BDD avec un champ "date " qui est surtout numérique"? Parfois il ne l'est pas?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Ikebukuro Voir le message
    Et si, pour le résultat qui te pose pb, tu affichais aussi chaine_AAAAMMJJ, on y verrait peut-être plus clair.
    On d'accord je propose de l'afficher dans la requête.

    Citation Envoyé par Ikebukuro Voir le message
    Que veux-tu dire par "J'ai une BDD avec un champ "date " qui est surtout numérique"? Parfois il ne l'est pas?
    "chaine_AAAAMMJJ" est une chaine de type alphanumérique . Dans la théorie cette chaine est supposé pouvoir accueillir des lettres et des chiffres . Dans la pratique le ménage est fait avant intégration on n'accepte que les chiffres. Ce champ est issue d'un formulaire de contact client qui doit saisir une date.

    12/03/19 > format ok
    12/03/2019 > format ok
    12/O3/19 > format non ok et rejeté lors de l'intégration
    12/O3/2019 > format non ok et rejeté lors de l'intégration

    Un robot vient reformaliser la chaine au format AAAAMMJJ pour stocké l'info . Je peut me retrouver avec 20190312 mais aussi 20190300 si la personne a mal saisi ou le bien le robot ne sait pas lire une partie de la chaine .

    Comme j'ai une chaine de type alphanumérique pour "AAAAMMJJ " , je veux la remettre d’équerre au format standard de lecture soit DD/MM/AAAA .

    J'ai donc ceci en base : AAAAMMJJ
    Que je retraduis par ceci : DD/MM/AAAA
    Oracle me donnant ce format à l'affichage : DD/MM/AA

    Peut être que l'opération n'est pas possible ?

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Et qu'est-ce qu'affiche la requête que tu as modifié pour la ligne contenant 11/03/19 au lieu de 11/03/2019?
    Ce que je veux c'est voir la valeur de la colonne chaine_AAAAMMJJ car si sa valeur est pourrie à la base, ton substr sera tout aussi pourri à la fin...

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Vérifiez votre format d'affichage des dates NLS_DATE_FORMAT pour votre session, NLS_SESSION_PARAMETERS, et modifiez le si nécessaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';
    Après je ne vois pas l'intérêt du découpage, il suffit de convertir directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date(chaine_AAAAMMJJ,'AAAAMMJJ') as date_europ
    Et renseignez bien toujours un format de conversion quand vous utilisez TO_DATE, ou TO_CHAR, pour éviter les conversions implicites.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Ikebukuro Voir le message
    Et qu'est-ce qu'affiche la requête que tu as modifié pour la ligne contenant 11/03/19 au lieu de 11/03/2019?
    En base de données avant requetage j'ai ceci 20190311 en varchar2(8) . Après avoir utilisé du to_date pour remembré dans un format conventionnel "date" j'ai ceci : 11/03/19 au de lieu de 11/03/2019.

    Citation Envoyé par Ikebukuro Voir le message
    Ce que je veux c'est voir la valeur de la colonne chaine_AAAAMMJJ car si sa valeur est pourrie à la base, ton substr sera tout aussi pourri à la fin...
    chaine_AAAAMMJJ est stocké en base sous un format varchar2(8) .

    Citation Envoyé par skuatamad Voir le message
    Vérifiez votre format d'affichage des dates NLS_DATE_FORMAT pour votre session, NLS_SESSION_PARAMETERS, et modifiez le si nécessaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';
    Après je ne vois pas l'intérêt du découpage, il suffit de convertir directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date(chaine_AAAAMMJJ,'AAAAMMJJ') as date_europ
    Et renseignez bien toujours un format de conversion quand vous utilisez TO_DATE, ou TO_CHAR, pour éviter les conversions implicites.
    Voici les format que j'ai en BDD :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NLS_DATE_FORMAT	DD/MM/RR
    NLS_DATE_LANGUAGE	FRENCH
    NLS_TIME_FORMAT	HH24:MI:SSXFF
    NLS_TIMESTAMP_FORMAT	DD/MM/RR HH24:MI:SSXFF
    NLS_TIME_TZ_FORMAT	HH24:MI:SSXFF TZR
    NLS_TIMESTAMP_TZ_FORMAT	DD/MM/RR HH24:MI:SSXFF TZR

    Loin du " DD/MM/YYYY HH24:MI:SS " , malheureusement je ne peux pas changer ce format je ne suis pas admin ...

    Je note la chose sous la main.

    Merci

  7. #7
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Et que donne ceci sur ta ligne posant pb? Je voudrais voir s'il y a vraiment une date sur 4 caractères pour cet enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select substr(chaine_AAAAMMJJ,1,4)
    from matable
    where chaine_AAAAMMJJ not like '%9999%'
    and chaine_AAAAMMJJ is not null
    and chaine_AAAAMMJJ != 0
    and substr(chaine_AAAAMMJJ,7,2) not like '00'
    and substr(chaine_AAAAMMJJ,5,2) not like '00'
    and substr(chaine_AAAAMMJJ,7,2) between 01 and 31
    and substr(chaine_AAAAMMJJ,5,2) between 01 and 12
    and substr(chaine_AAAAMMJJ,1,4) > 1900 ;

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par tanaka59 Voir le message
    Loin du " DD/MM/YYYY HH24:MI:SS " , malheureusement je ne peux pas changer ce format je ne suis pas admin ...
    C'est un paramètre de session utilisé pour l'affichage au format texte des dates, pas besoin d'être admin pour le modifier.
    C'est juste pour que vous compreniez le résultat que vous obtenez, l'affichage de l'année est paramétrée sur 2 caractères RR.

    Sinon vous pouvez afficher la date avec TO_CHAR en précisant le format.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_char(to_date(chaine_AAAAMMJJ,'AAAAMMJJ'), 'dd/mm/yyyy')
    Mais pour le calcul pas besoin de formater l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('11/03/2018', 'dd/mm/yyyy') - to_date(chaine_AAAAMMJJ,'AAAAMMJJ') as difference

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Citation Envoyé par Ikebukuro Voir le message
    Et que donne ceci sur ta ligne posant pb? Je voudrais voir s'il y a vraiment une date sur 4 caractères pour cet enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select substr(chaine_AAAAMMJJ,1,4)
    from matable
    where chaine_AAAAMMJJ not like '%9999%'
    and chaine_AAAAMMJJ is not null
    and chaine_AAAAMMJJ != 0
    and substr(chaine_AAAAMMJJ,7,2) not like '00'
    and substr(chaine_AAAAMMJJ,5,2) not like '00'
    and substr(chaine_AAAAMMJJ,7,2) between 01 and 31
    and substr(chaine_AAAAMMJJ,5,2) between 01 and 12
    and substr(chaine_AAAAMMJJ,1,4) > 1900 ;
    J'ai bien l'année sur 4 chiffres qui s'affiche.

    Citation Envoyé par skuatamad Voir le message
    C'est un paramètre de session utilisé pour l'affichage au format texte des dates, pas besoin d'être admin pour le modifier.
    C'est juste pour que vous compreniez le résultat que vous obtenez, l'affichage de l'année est paramétrée sur 2 caractères RR.

    Sinon vous pouvez afficher la date avec TO_CHAR en précisant le format.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_char(to_date(chaine_AAAAMMJJ,'AAAAMMJJ'), 'dd/mm/yyyy')
    Mais pour le calcul pas besoin de formater l'affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_date('11/03/2018', 'dd/mm/yyyy') - to_date(chaine_AAAAMMJJ,'AAAAMMJJ') as difference
    Je viens de percuter . Le to_char sert à forcer l'affichage sur 4 au lieu d'un affichage par "défaut" de type RR sur 2.

    Je note la chose de côté bien au chaud ...

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

Discussions similaires

  1. [Débutant] calcul sur des dates . TimeSpan
    Par stracoma dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/08/2015, 00h01
  2. Calcul sur des dates
    Par seyli1234 dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 06/04/2012, 16h29
  3. [XL-2007] erreur lors d'un calcul sur des dates
    Par kidone dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/11/2011, 17h13
  4. Calcul sur des dates
    Par cdumas dans le forum Deski
    Réponses: 9
    Dernier message: 23/11/2006, 15h01
  5. DataColumn avec un calcul sur des dates
    Par GeantVert13 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 24/10/2006, 21h19

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