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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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