2011-04-29 3 views
1

Travail à partir d'un environnement Oracle 10g.Requête SQL Recherche d'enregistrement spécifique par date

Supposons que vous avez reçu: * NOTE (La durée est en semaines)

CLASSNAME     INSTURCTOR  DAYS  STARTDATE *DURATION TIMESTART TIMEEND 
------------------------- ----------------------- ------------- --------- -------- -------- 
Power Dance    Robert Backman MWF  03-MAR-11   2 0930  1100 
Power Dance    Lynn Parker  MWF  03-MAY-11   2 0930  1100 
Power Dance    Lynn Parker  MTTh  18-MAY-11   2 1230  0100 
Club Stretch    Kevin Lopez  MT  24-OCT-11   3 1930   2015 
Club Stretch    Kevin Lopez  F  17-JUN-11   3 1130  1300 
Hatha Yoga    Susan Wanzer  MW  25-MAY-11   3 1900  2000 

Un utilisateur souhaite pouvoir interroger le Classname, instructeur, timestart et TimeEnd pour une classe donnée une date précise.

Je comprends comment trouver le EndDate en utilisant (Duration * 7) + StartDate. Le problème que j'ai est de savoir quelles classes fonctionnent un jour de la semaine. Comme l'utilisateur entre dans 24-JUN-11, la seule classe qui devrait apparaître devrait être Club Stretch.

Répondre

0

Il se peut que ce soit juste une question de reformulation de votre question: vous voulez savoir quelles classes commencent à avant la date spécifiée et se terminent à ou après cette date spécifiée. Vous avez déjà la date de début et vous savez comment calculer la date de fin.

Ce sera votre solution:

SELECT [columns] 
FROM [table] 
WHERE @specifiedDate BETWEEN [startDate] AND [calculatedEndDate] 
    AND [days] LIKE @specifiedWeekday 

@specifiedWeekday devrait, lorsque vous cherchez un lundi, une valeur comme celui-ci (dans MS SQL): '%M%'

REMARQUE: Il suffit de lire maintenant votre travail en Oracle. Ceci est une réponse SQL Server. J'espère que l'idée derrière cela vous aidera.

+0

Peut-être que je était un peu flou, l'intention est que l'utilisateur entre dans une date, disons le 31 mai 2011 qui est un mardi et les résultats devraient être seulement les classes qui se rencontrent les mardis qui sont en session pendant cette période. La façon dont je l'ai fonctionné maintenant est que si l'utilisateur entre en mai 31-2011 je peux retourner les classes qui sont actives pendant cette période, mais pas les classes exactes se rencontrant ce jour-là. – tyh

+0

Avez-vous une influence sur la façon dont les données sont stockées dans cette table? Pouvez-vous stocker les jours avec un séparateur entre les deux? Comme M; T; Th; F ;? La façon dont les jours sont actuellement stockés, il n'est guère impossible d'ignorer les jeudis quand vous cherchez les mardis. – Jacco

+0

Ouais j'ai réalisé ce problème, je pense à revenir aux tables d'origine et à les changer pour des entrées plus appropriées puisque comme vous l'avez dit, il est très difficile de différencier les mardis et les jeudis. Si elles étaient séparées ou jeudi était un R à la place, serait-il possible d'interroger comme je l'ai décrit? – tyh

0

Il me semble que vous devez d'abord déterminer le magasin de la journée de la semaine en tant que variable que vous alimenteriez de la deuxième à la deuxième requête. échantillon de requête pour la première partie ci-dessous:

select to_char(to_date('31-May-2011','dd-Mon-yyyy'),'DAY') from dual 
SQL>/

TO_CHAR(T 
--------- 
TUESDAY 

ou

select to_char(to_date('31-May-2011','dd-Mon-yyyy'),'DY') from dual 
TO_ 
--- 
TUE 

alors vous pourriez nourrir que dans votre autre question avec votre jour maintenant connu de la semaine. Si vous avez besoin de le décoder les formats que vous mentionnez ensuite le code suivant convertira le jour de la semaine pour les abréviations que vous montrez:

select decode(to_char(to_date('26-May-2011','dd-Mon-yyyy'),'DY'), 'MON','M', 
                    'TUE','T', 
                    'WED','W', 
                    'THU','Th', 
                    'FRI','F', 
                    'SAT','Sa','Su') 
from dual 

renverront le Th vous utilisez :)