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 :

Format de données DATE


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut Format de données DATE
    Bonjour,

    je dois récupérer des informations à partir de leur date.
    La formule relative à ces dates est la suivante : A un jour J, on récupère les infos depuis J-8 de l'année N-1 jusqu'au jour J-8 de l'année N.

    Un des problèmes étant que le format "date" de la table est en VARCHAR2, de type 20110101 010101 pour : 1er janvier 2011 à 1h, 1min et 1s.

    Donc j'ai essayé ça déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select sysdate-interval '1' year - interval '8' day from dual;
    avec ceci je récupère la valeur J-8 de l'année N-1, sous un format DATE normal.

    Ensuite,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select to_char(to_date(substr(<champDate>,1,8), 'YYYYMMDD') - interval '1' year - interval '8' day, 'YYYYMMDD HH24MISS') as nouvelleDate
    from nomTable, dual
    WHERE nouvelleDate < <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS');
    Donc, le substr sert à récupérer uniquement la partie intéressante , jour + mois + année.

    Et ensuite j'avoue qu'avec toutes ces parenthèses, j'ai du mal à m'y retrouver.
    Surtout que j'ai un message d'erreur :
    ORA-00933 :
    La commande SQL ne se termine pas correctement
    Donc, j'aimerais bien savoir si ma méthode semble/est bonne et s'il y a moyen de l'améliorer ?

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE nouvelleDate < <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS')
    Il y a une erreur dans cette expression.

    Il faut l'écrire sous la forme de deux expressions de comparaison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE   nouvelleDate < <champDate> 
        AND <champDate> <= to_char(sysdate - interval '8' day, 'YYYYMMDD HH24DDSS')
    Ensuite, l'utilisation de dual en produit cartésien avec une autre table est totalement inutile.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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
    Interval il ne faut pas l'utiliser en soustraction car il n'est pas intelligent sur les années bissextiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select date '2012-02-29' - interval '1' year as dt
      from dual;
     
    -- ORA-01839: le quantième n'est pas valide pour le mois indiqué
    Pour vos données, je vous conseille de modifier votre table et d'utiliser un type date.

    En attendant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT <vos colonnes>
      FROM nomTable
     WHERE to_date(<champDate>, 'YYYYMMDD HH24MISS') between add_months(sysdate - 8, -12) and sysdate - 8;

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Il y a une erreur dans cette expression.
    Ensuite, l'utilisation de dual en produit cartésien avec une autre table est totalement inutile.
    OK merci pour les précisions !

    Citation Envoyé par Waldar Voir le message
    Interval il ne faut pas l'utiliser en soustraction car il n'est pas intelligent sur les années bissextiles :

    Pour vos données, je vous conseille de modifier votre table et d'utiliser un type date.
    En attendant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT <vos colonnes>
      FROM nomTable
     WHERE to_date(<champDate>, 'YYYYMMDD HH24MISS') between add_months(sysdate - 8, -12) and sysdate - 8;
    ça serait trop simple de modifier la structure et prendre un vrai champ date
    Je dois me contenter de ce varchar2.

    J'obtiens un résultat avec vos modifs, mais pas celui attendu (format bizarre).
    Je vais essayer quelques modifs sur le format pour essayer d'avoir le bon.

    Merci à vous deux.

  5. #5
    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
    Citation Envoyé par feldi Voir le message
    J'obtiens un résultat avec vos modifs, mais pas celui attendu (format bizarre).
    Je n'ai rien mis dans le select !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mai 2010
    Messages
    347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2010
    Messages : 347
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je n'ai rien mis dans le select !
    J'avais adapté ta requête à mon besoin avant de l'éxécuter

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

Discussions similaires

  1. [MySQL] Changer le format d'une donnée date
    Par Ankh2 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/03/2013, 16h37
  2. transformer une donnée date en char(8) en format date
    Par zaza07 dans le forum SAS Base
    Réponses: 4
    Dernier message: 12/02/2008, 09h23
  3. [MySQL] Transformation du format de la date de la base de données
    Par npirard dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/10/2007, 19h09
  4. Format de données (NUMBER à DATE)
    Par DJuL- dans le forum SQL
    Réponses: 4
    Dernier message: 05/09/2007, 10h29
  5. Réponses: 4
    Dernier message: 04/12/2003, 08h12

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