Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2007, 20h22   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 0
Points : 0
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.

Citation:
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 :
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....
manotas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 00h00   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
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 :
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 ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 14h12   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 0
Points : 0
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 :
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 ...
manotas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h23.


 
 
 
 
Partenaires

Hébergement Web