SQL-запрос на поиск конкретной записи по дате

#sql #date #oracle10g

#sql #Дата #oracle10g

Вопрос:

Работа в среде Oracle 10g.

Предположим, вам было предоставлено: * ПРИМЕЧАНИЕ (продолжительность указана в неделях)

 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
  

Пользователь хочет иметь возможность запрашивать имя класса, инструктора, начало и окончание времени для класса с заданной конкретной датой.

Я понимаю, как найти конечную дату, используя (длительность * 7) начальную дату. Проблема, с которой я сталкиваюсь, заключается в том, чтобы выяснить, какие классы выполняются в день недели. Как, скажем, пользователь вводит 24 июня-11, единственным классом, который должен отображаться, должен быть Club Stretch.

Ответ №1:

Возможно, это просто вопрос перефразирования вашего вопроса: вы хотите знать, какие классы начинаются в из до указанной даты и заканчиваются в указанную дату или после нее. У вас уже есть начальная дата, и вы знаете, как вычислить конечную дату.

Это будет вашим решением:

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

@specifiedWeekday должно ли при поиске понедельника иметь значение, подобное этому (в MS SQL): '%M%'

ПРИМЕЧАНИЕ: Только что прочитал вашу работу в Oracle. Это ответ SQL Server. Я надеюсь, что идея, лежащая в основе этого, поможет вам в этом.

Комментарии:

1. Возможно, я был немного неясен, цель состоит в том, чтобы пользователь вводил дату, скажем, 31 мая 2011 года, которая приходится на вторник, и результатами должны быть только классы, которые встречаются по вторникам, которые находятся в сеансе в течение этого периода. То, как я это делаю сейчас, заключается в том, что если пользователь вводит данные в May-31-2011, я могу вернуть классы, которые активны в течение этого периода времени, но не точные классы, которые встречаются в этот день.

2. Оказываете ли вы влияние на то, как данные хранятся в этой таблице? Можете ли вы хранить дни с разделителем между ними? Например, M; T; Th;F;? Учитывая, как в настоящее время хранятся дни, вряд ли возможно игнорировать четверги, когда вы ищете вторники.

3. Да, я понял эту проблему, я подумываю о том, чтобы вернуться к исходным таблицам и заменить их более подходящими записями, поскольку, как вы сказали, очень сложно различать вторники и четверги. Если бы они были разделены или вместо Thursday был R, можно ли было бы выполнить запрос, как я описал?

4. Если вы можете определить день недели в своем приложении или в Oracle, вы могли бы расширить инструкцию с помощью инструкции LIKE.

Ответ №2:

Мне кажется, что вам нужно сначала определить день недели, сохранить его в качестве переменной, которую вы передали бы второму запросу. Пример запроса для первой части ниже:

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

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

или

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

затем вы могли бы ввести это в свой другой запрос с указанием вашего теперь известного дня недели. Если вам нужно декодировать ее в указанные вами форматы, то следующий код преобразует день недели в отображаемые вами сокращения:

 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
  

вернет то, что вы используете 🙂