#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
вернет то, что вы используете 🙂