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 :

Requêtes sur les dates


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut Requêtes sur les dates
    Bonjour,

    Voila j'aimerai savoir comment récupérer le trimestre en cours en connaissant le mois en cours.

    j'ai trouvé la fonction to_date pour mettre dans le where, je voudrais donc faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from ma_table where champ_date = to_date(sysdate, 'q');
    le q étant pour quarter (trimestre donc)

    Mais cette requete ne marche pas elle retourne :
    ORA-01820: format code cannot appear in date input format
    Pouvez vous m'aider Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    En utilisant le to_date, tu essaies de convertir une chaîne de caractère en date.

    Si tu veux récupérer le trimestre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select to_char(sysdate, 'q') from dual;
    T
    -
    3
    Si tu veux récupérer le 1è jour du trimestre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> select trunc(sysdate, 'q') from dual;
    TRUNC(SY
    --------
    01/07/08
    A partir de là tu devrais t'en sortir pour obtenir le résultat que tu souhaires

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    alors j'ai essayé en remplaçant mon to_date par to_char mais la requête ne retourne toujours rien et je ne vois pas d'autres façons de faire ... (je suis un peu une bille en sql ça aide pas )

  4. #4
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    A quoi correspond ta colonne champ_date ?

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    En fait j'ai un script écrit en php qui tourne toutes les 5 minutes (configuré dans mon crontab) et qui récupère la disponiblilité de toutes mes appli et enregistre ça dans ma table

    mon champ champ_date corresponds donc à la date + l'heure de la vérif
    en gros je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO ma_table(champ_date) VALUES (sysdate);

  6. #6
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Et tu ne vois pas le problème ? Tu compares une date à une chaîne de caractère... Compares des choses identiques et cela fonctionnera

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Le truc c'est que si je fais quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-table WHERE champ_date = to_char(sysdate, 'DD/MM/YYYY');
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-table WHERE champ_date = to_char(sysdate, 'DD - HH24:MI:SS');
    ça marche. donc est-ce vraiment un problème de ce type ?

    Et puis si j'insérais un char dans un champ de type date oracle m'aurait retourné une erreur non ? le sysdate ne serait-il pas converti automatiquement en date ? (beaucoup de questions certes mais c'est pour mieux comprendre par la suite)

  8. #8
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Sh4dow49 Voir le message
    Le truc c'est que si je fais quelque chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-table WHERE champ_date = to_char(sysdate, 'DD/MM/YYYY');
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-table WHERE champ_date = to_char(sysdate, 'DD - HH24:MI:SS');
    ça marche. donc est-ce vraiment un problème de ce type ?
    Oui puisque dans ce cas tu compares des choses identiques. Oracle arrive donc à faire une conversion implicite.

    Si tu fais un to_char(sysdate, 'q'), c'est une chaîne de caractères sous forme de nombre qui est renvoyée et non sous forme de date, donc ce n'est pas une comparaison cohérente.

    => soit tu compares des chaînes de caractères correspondant au numéro de trimestre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-TABLE WHERE to_char(champ_date, 'q') = to_char(sysdate, 'q');
    => soit tu compares des dates tronquées au premier jour du trimestre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma-TABLE WHERE trunc(champ_date, 'q') = trunc(sysdate, 'q');

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Ok ok, je comprends. Tes requêtes marchent bien, merci beaucoup pour ton aide, j'y vois plus clair !

  10. #10
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Sh4dow49 Voir le message
    j'y vois plus clair !
    C'est ça le plus important

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Je reviens sur mon sujet, je pensais avoir saisi l'esprit mais il s'avère que j'ai encore un problème ...

    J'ai testé plusieurs sortes de requête dont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE to_char(champ_date, 'DD/MM/YYYY') = to_char(sysdate, 'DD/MM/YYYY');
    qui fonctionne et me renvoie bien tous les enregistrements créés aujourd'hui, et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE to_char(champ_date, 'DD/MM/YYYY') = to_char('30/07/2008', 'DD/MM/YYYY');
    qui ne marche pas ...

    J'ai essayé des between aussi mais dès que la date renseignée est une autre que sysdate, erreur suivante :
    ORA-0843: not a valid number
    J'ai pas du bien comprendre un truc

  12. #12
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE champ_date = to_date ('30/04/1985', 'DD/MM/YYYY')

  13. #13
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Ce qu'il faut que tu comprennes c'est que les fonctions TO_xxx sont des fonctions de conversion.

    to_char(sysdate, 'DD/MM/YYYY') a un sens puisque tu convertis la date du jour en chaine de caractères au format DD/MM/YYYY

    Mais to_char('30/07/2008', 'DD/MM/YYYY') n' aucun sens puisque '30/07/2008' est déjà une chaîne de caractère.

    Remarque importante : il est plus propre quand tu compares des dates, d'utiliser la fonction trunc qui conserve le format date mais qui tronque à la précision demandée.

    Ainsi la requête suivante revient au même que ta première requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE trunc(champ_date, 'DD') = trunc(sysdate, 'DD');
    L'avantage est que tu peux faire des calculs sur des dates, ce que tu ne peux pas faire avec un to_char.

  14. #14
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par LeoAnderson Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table WHERE champ_date = to_date ('30/04/1985', 'DD/MM/YYYY')
    Attention, si les dates sont stockées avec les heures cela ne fonctionne pas

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    Oki oki, en effet ça marche.

    Mais donc cela voudrait dire que le sysdate lors de l'insert est convertit automatiquement au format date ? si c'est le cas j'aurai donc (si j'ai bien compris) tout le temps à faire ce cette façon lors des select (c-a-d champ_date = to_date(ma date, format) ).

  16. #16
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Par défaut
    En effet avec les heures il retourne une erreur ...

    Et si je modifiais ma requête insert pour qu'il y ai un système de select qui fonctionne à coup sur ? comment devrais-je insérer mon sysdate dans le champ date ?

  17. #17
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Citation Envoyé par Sh4dow49 Voir le message
    Mais donc cela voudrait dire que le sysdate lors de l'insert est convertit automatiquement au format date ?
    SYSDATE est un fonction qui renvoie une date. Comme toutes les dates oracle, elle contient les jours, mois, années, heures, minutes, secondes

Discussions similaires

  1. [MySQL] requète sur les dates dans mysql
    Par laloupiote dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 23/02/2014, 16h27
  2. Requête sur les dates
    Par saigon dans le forum Langage SQL
    Réponses: 23
    Dernier message: 08/06/2012, 13h23
  3. Requête sur les dates futures plus une date passée
    Par yonn_b dans le forum Requêtes
    Réponses: 13
    Dernier message: 26/01/2012, 08h59
  4. Problème avec une requête sur les dates
    Par diblasio dans le forum Requêtes
    Réponses: 11
    Dernier message: 09/08/2011, 16h00
  5. [SQL] Requête sur les dates
    Par JohnnyWalk dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/12/2007, 19h24

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