2012-04-18 2 views
8

У меня есть таблица, в которой хранятся дни и времена, столбец дня, может содержать любой из семи дней, введенных в нее, и они имеют тип данных varchar. Поскольку эта таблица содержит время резервирования для клиента, я хочу выбрать все дни из таблицы, где совпадает идентификатор, и я хочу сортировать по понедельникам по воскресенье. Я надеялся, что я мог бы добавить что-то на этот запрос, чтобы вручную выбрать порядок результаты вернуться примерно так:Можно ли выбрать конкретный ORDER BY в SQL Server 2008?

select * 
from requirements 
where Family_ID = 1 
ORDER BY Day, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday 

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

Сортировка по DESC и ASC не помогает с днями недели, я был бы признателен за любые советы о том, как добиться этого.

Спасибо.

+1

Будет ли использовать функцию DATEPART (будний день, @ dtDate)? Это дало бы вам дни недели как цифры –

ответ

26

Хмм .. это неприятно, дни хранятся как дословно «понедельник», «вторник» и т. Д.?

Во всяком случае, просто сделать это:

SELECT * 
FROM Requirements 
ORDER BY 
    CASE Day 
    WHEN 'Monday' THEN 1 
    WHEN 'Tuesday' THEN 2 
    WHEN 'Wednesday' THEN 3 
    WHEN 'Thursday' THEN 4 
    WHEN 'Friday' THEN 5 
    WHEN 'Saturday' THEN 6 
    WHEN 'Sunday' THEN 7 
    END 
+0

Привет, ваше решение сработало, большое вам спасибо! Это еще одна вещь! У меня сегодня нет ни одного голоса, но когда они будут обновлены, я проголосую за ваш ответ. Могу ли я просто спросить, что вы имеете в виду о моем способе делать что-то неприятное, я чувствовал, что это не лучший способ сделать это. Радости быть новичком! – deucalion0

+1

Либо используйте DATETIME, либо используйте целое число для недельных дней, например. 0 = Суббота, 1 = Понедельник, 2 = Вторник и т. Д. Таким образом, вы можете естественным образом отсортировать поле, либо: 'ORDER BY DATEPART (WEEKDAY, DateTimeFieldHere)', или это: 'ORDER BY DateTimeFieldHere' –

+1

Если повторно, проектирование таблицы не является для вас вариантом в данный момент времени, просто добавьте вычисленный столбец для этих 'CASE WHENs'. Таким образом, вы можете сортировать по индексируемому полю. Вычисленный столбец может ускорить сортировку или фильтрацию. например http://www.mssqltips.com/sqlservertip/1682/using-computed-columns-in-sql-server-with-persisted-values/ http://blog.sqlauthority.com/2010/08/13/sql- server-computed-column-and-performance-part-3/ –

1

ИМХО у вас нет никаких причин, чтобы сохранить Monday, Tuesday, etc ... Если вы сохраняете дату или значение даты и времени, всегда можно извлечь имя буднего из этих данных во время запроса, когда вам это нужно - либо используя DATENAME в вашем запросе, либо используя функциональные возможности вашего уровня представления. Стоимость выполнения этого не оправдывает хранение его отдельно IMHO. И вы все равно должны правильно сортировать данные с использованием данных даты/даты и времени.

Смежные вопросы