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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    A quoi correspond ta colonne champ_date ?

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Sh4dow49 Voir le message
    j'y vois plus clair !
    C'est ça le plus important

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 199
    Points
    3 199
    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
    Points : 3 609
    Points
    3 609
    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
    Points : 3 609
    Points
    3 609
    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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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 actif
    Inscrit en
    Avril 2007
    Messages
    483
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Avril 2007
    Messages : 483
    Points : 234
    Points
    234
    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
    Points : 3 609
    Points
    3 609
    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