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ête ranges des dates retouné dans cursor


Sujet :

SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Requête ranges des dates retouné dans cursor
    Salut à tous,

    Il me faut faire une requête sur une table, du type comme ci-dessous, que corresponde à le temps d'utilisation des nos salles de réunion.

    MaTable
    MonChampClé - VarChar2
    DT_DEBUT - DATE
    DT_FIN - DATE
    .
    .
    .
    Donné une date, je dois retourner la liste des salles et une collonne additionelle avec 1 si la salle a été utilisé toute la matinée ou l'après-midi, et 2si a été occuppé toute la journée.

    Je ne trouve pas comment faire avec une simple requête, donc je penche pour utiliser une fonction avec une bucle, en comparant les dates et après ajoutant le valeur correspondant dans une nouvelle colonne, et ainsi jusque parcourir toutes les salles.... mais qqn pourrais me dire comment retourner ça à le style d'un cursor ou une sorte de table ?

    Au debut j'avais pensé à récupérer les salles en deux bloques (avant et après 12h:30), mais j'ai un peu de mal à gérer les reunions commencés avant midi mais qui c terminent après.....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    select room_num_cd, to_Char(rsv_dt_begin, 'dd/mm/yyyy') as bgn, sum (to_number(rsv_dt_end - rsv_dt_begin) * 24)  as colDiff  from room_rsv 
    where rsv_dt_begin >= to_date('01/01/2007', 'dd/mm/yyyy') 
    AND (TO_TIMESTAMP ( to_Char(rsv_dt_begin, 'hh24:mi:ss'), 'hh24:mi:ss') BETWEEN  TO_TIMESTAMP ('07:45:00', 'hh24:mi:ss') 
    AND TO_TIMESTAMP ('12:15:00', 'hh24:mi:ss'))
    group by room_num_cd, to_Char(rsv_dt_begin, 'dd/mm/yyyy')

    Tout aide est bien reçue !!! Qqn pourrais me donner une idée de comment faire recuperer ça comme dans une table ou cursor plus ma colonne ?? Ou un autre moyen pour le faire directement dans une Query ?

    Merci en avance....

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par manotas Voir le message
    select room_num_cd, to_Char(rsv_dt_begin, 'dd/mm/yyyy') as bgn, sum (to_number(rsv_dt_end - rsv_dt_begin) * 24) as colDiff from room_rsv
    where rsv_dt_begin >= to_date('01/01/2007', 'dd/mm/yyyy')
    AND (TO_TIMESTAMP ( to_Char(rsv_dt_begin, 'hh24:mi:ss'), 'hh24:mi:ss') BETWEEN TO_TIMESTAMP ('07:45:00', 'hh24:mi:ss')
    AND TO_TIMESTAMP ('12:15:00', 'hh24:mi:ss'))
    group by room_num_cd, to_Char(rsv_dt_begin, 'dd/mm/yyyy')
    :dt dans le code ci-dessus déigne la date concernée par l'opération. Une idée qui peut être exploité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    with t as
    (
      select room_num_cd,
      sum
      (
        case
           when rsv_dt_begin < :dt + interval '12:30' hour to minute then
             (least(:dt + interval '12:30' hour to minute, rsv_dt_end)  - rsv_dt_begin) * 24
           else 0
        end
      ) am,
      sum
      (
        case
           when rsv_dt_end > :dt + interval '12:30' hour to minute then
             (least(:dt + interval '17:30' hour to minute, rsv_dt_end)  - greatest (rsv_dt_begin, :dt + interval '12:30' hour to minute,) * 24
           else 0
        end
      ) pm
      from room_rsv
      where rsv_dt_begin > :dt
      group by room_num_cd
    )
    select ...
    Consultant et formateur Oracle

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Salut, merci bcp de repondre si vite.

    J'ai essayé ta requête, mais j'arrive pas à la faire marcher.

    Il semblerait qu'il manque un parametre dans la clause << greatest (rsv_dt_begin, :dt + interval '12:30' hour TO minute,rsv_dt_begin))>>...
    j'ai mis rsv_dt_begin sans trop savoir si s'est bien ça qu'il faudrait mettre, car j'avoue que je ne comprends toujours pas toute la logique de ta requête, et je comptait la faire tourner pour y arriver.

    Maintenant j'au un erreur "ORA-30081: invalid data type for datetime/interval arithmetic" ...

    Je suis désolé mais en étant un peu debutant dans PL/SQL, je ne sais plus comment la fixer. Saurais tu me dire qu'est qui n'irais pas là ?

    Ta proposition à l'air bien interessant, je suis persuadé qu'elle pourrais m'aider à résoudre mon pbm.

    Merci encore.



    Citation Envoyé par Michel SALAIS Voir le message
    :dt dans le code ci-dessus déigne la date concernée par l'opération. Une idée qui peut être exploité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    with t as
    (
      select room_num_cd,
      sum
      (
        case
           when rsv_dt_begin < :dt + interval '12:30' hour to minute then
             (least(:dt + interval '12:30' hour to minute, rsv_dt_end)  - rsv_dt_begin) * 24
           else 0
        end
      ) am,
      sum
      (
        case
           when rsv_dt_end > :dt + interval '12:30' hour to minute then
             (least(:dt + interval '17:30' hour to minute, rsv_dt_end)  - greatest (rsv_dt_begin, :dt + interval '12:30' hour to minute,) * 24
           else 0
        end
      ) pm
      from room_rsv
      where rsv_dt_begin > :dt
      group by room_num_cd
    )
    select ...

Discussions similaires

  1. Mysql requête sur des dates
    Par lampre dans le forum Requêtes
    Réponses: 10
    Dernier message: 19/12/2006, 11h50
  2. [Conception] Requête sur des dates pour stats
    Par vallica dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2006, 10h15
  3. [MySQL] Problème de requête sur des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2006, 13h08
  4. SQL Requête avec des dates
    Par dahu29 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/03/2006, 18h20
  5. ajouter des dates délémitées dans INSERT INTO ?
    Par samlepiratepaddy dans le forum Access
    Réponses: 8
    Dernier message: 27/09/2005, 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