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

Oracle Discussion :

Requêtes Oracle et calcul de date


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut Requêtes Oracle et calcul de date
    Bonjour,

    J'essaye via une requête oracle d'avoir en retour tous les enregistrements ayant leur champs date correspondant à datedujour_jusqu'àune heure précise > champs

    Ex:

    jour: 18/03/2006 >> ma requête me retourne tous les enregistrement ayant le champs date inférieure à 18/03/2006 18:30:00

    Je parvient bien à récupérer la date en cours via sysdate, mais mon problème est dans le calcul
    1) la comparaison
    2) l'ajout de 18:30 ) ce sysdate

    comment puis-je faire cela ?

    D'avance, merci à vous.

  2. #2
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    Bonjour,

    Tu peux utiliser les fonctions telles que to_char ou to_date pour t'en sortir.

    Quelque chose comme ça, marcherait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    SELECT TO_DATE(TO_CHAR(SYSDATE,"DD/MM/YYYY")||
    "18:30","DD/MM/YYYY HH24:Mi") FROM DUAL ;
    Ensuite avec cet objet Date, tu fais tes comparaisons.

    Désolé je n'ai pas Oracle sous la main, et je ne suis pas sûr des HH24 ou Mi, tu peux les trouver sur la doc.

  3. #3
    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
    Tu peux également faire quelque chose comme cela :
    - si les données sont les suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQL> select to_char (d, 'DD/MM/RRRR HH24:MI') from test_date;
    TO_CHAR(D,'DD/MM
    ----------------
    18/04/2006 08:30
    19/04/2006 08:30
    09/04/2006 09:00
    19/04/2006 09:00
    19/04/2006 10:00
    19/04/2006 14:30
    6 rows selected.
    - Si tu veux les dates avant 12:30 aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> select to_char (d, 'DD/MM/RRRR HH24:MI')
      2  from test_date
      3  where d between trunc (sysdate) and trunc (sysdate) + 12/24 + 30/(24*60);
    TO_CHAR(D,'DD/MM
    ----------------
    19/04/2006 08:30
    19/04/2006 09:00
    19/04/2006 10:00
    - ou si tu veux les dates avant 9:30 aujourd'hui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SQL> select to_char (d, 'DD/MM/RRRR HH24:MI')
      2  from test_date
      3  where d between trunc (sysdate) and trunc (sysdate) + 9/24 + 30/(24*60);
    TO_CHAR(D,'DD/MM
    ----------------
    19/04/2006 08:30
    19/04/2006 09:00
    L'avantange de cette solution est que tu prends les indexes si ta colonne d est indexée

  4. #4
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    merci de votre aide.
    En fait, j'ai pris toutes vos idéees, et ça donné ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select xxxxx from xxxxx
    where to_char(monchampsdate, 'DD/MM/YYYY HH24:MM:SS') <
    ( select to_char(sysdate,'DD/MM/YYYY HH24:MM:SS') from dual 
    where to_number (to_char(sysdate,'HH24MI')) < 1830
    et cela fonctionne nickel

    merci à vous pour vos tuyaux !

  5. #5
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    oh my god !
    Ca fonctionne, mais c'est très mauvais au niveau des performances.

    Ceci devrait être bien mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select xxxxx from xxxxx where 
    monchampsdate < TO_DATE(TO_CHAR(SYSDATE,"DD/MM/YYYY")||
    "18:30","DD/MM/YYYY HH24:MI")
    Puis sinon, apparement la version de plaineR serait plus optimisée par rapport aux indexs.

    A+

  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
    Citation Envoyé par KiLVaiDeN
    oh my god !
    Ca fonctionne, mais c'est très mauvais au niveau des performances.

    Ceci devrait être bien mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select xxxxx from xxxxx where 
    monchampsdate < TO_DATE(TO_CHAR(SYSDATE,"DD/MM/YYYY")||
    "18:30","DD/MM/YYYY HH24:MI")
    Puis sinon, apparement la version de plaineR serait plus optimisée par rapport aux indexs.

    A+
    Non, ta requête prend bien l'index, si la colonne monchampsdate est indexée.
    Le seul avantage de ma requête est d'utiliser trunc qui évite les conversions puisqu'il renvoie une date (donc un peu plus rapide).

  7. #7
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 864
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 864
    Points : 3 438
    Points
    3 438
    Par défaut
    En créant une variable pour contenir la date à comparer, tu devrais obtenir la performance optimale

  8. #8
    Membre régulier
    Inscrit en
    Mai 2005
    Messages
    364
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 364
    Points : 120
    Points
    120
    Par défaut
    au fait, pour info, le champs date n'est pas indéxé

    merci encore

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

Discussions similaires

  1. [Requête ou VBA] Calcul et Attribution de date
    Par ancel17 dans le forum Access
    Réponses: 2
    Dernier message: 11/12/2013, 12h30
  2. Réponses: 6
    Dernier message: 05/01/2009, 11h18
  3. Oracle 10g - calcul sur les dates
    Par themateo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 17/08/2007, 11h50
  4. Réponses: 6
    Dernier message: 25/03/2006, 17h09
  5. Calculer différence date champ d'une même requête
    Par priest69 dans le forum Access
    Réponses: 20
    Dernier message: 11/11/2005, 21h15

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