2009-07-14 6 views

ответ

29

Либо переработайте столбец, как предложено Williham Totland, либо выполните синтаксический анализ строк, чтобы получить представление даты.

Если столбец только содержит день недели, то вы можете сделать это:

ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'); 
+5

Понедельник сначала. ;) –

+1

Как вы можете сказать, я очень внимательно обратил внимание на порядок :( –

+1

Может быть явным для большинства, но не набирайте <> при вводе имени поля. –

3

Я думаю, что, не переделав столбец, чтобы использовать перечисление вместо этого, для этого нечего делать, кроме сортировки результатов после того, как вы их вытащили.

Редактировать: грязный взломать, конечно, добавить еще одну таблицу с парами id: weekday и с помощью объединений или выбрать в выборе для подделки перечисления.

+0

Печально, но это правда. +1 – Abinadi

0

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

Table DaysOfWeek 
id  | day 
-------------------- 
1  | Monday 
2  | Tuesday 
3  | Wednesday 
4  | Thursday 
5  | Friday 
6  | Saturday 

SELECT * FROM WhateverTable LEFT JOIN DaysOFWeek на DaysOFWeek.day = WhateverTable.dayColumn ORDER BY DaysOfWeek.id

(Извиняюсь, если это не правильно; я застрял с сервером SQL недавно)

Опять же, это НЕ рекомендуется, но если вы не можете изменить данные, которые у вас уже есть ... Это также будет работать, если в поле dayColumn есть нестандартные значения.

1

Это выглядит неаккуратно, но все еще работает, и кажется более универсальным:

select day, 
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 as day_nr from test order by day_nr; 

Использование если еще более общий характер и хаотичным:

select id, day, 
if(day = 'monday',1, 
    if(day = 'tuesday',2, 
    if(day = 'wednesday',3, 
     if(day = 'thursday',4, 
     if(day = 'friday',5, 
      if(day = 'saturday',6,7) 
     ) 
    ) 
    ) 
) 
) as day_nr from test order by day_nr; 

Вы также можете скрыть детали преобразования от имени в целое в хранимой процедуре.

0

... ORDER BY date_format (order_date, '% w') = 0, date_format (order_date, '% w');

0

Я понимаю, что это старый поток, но, когда дело доходит до вершины Google для определенного времени поиска, я буду использовать его для совместного использования моего подхода.

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

Я создал отдельную таблицу, в которой дни были указаны за две недели, так что независимо от того, в какой день вы начали с вас, вы могли бы пройти через 7 дней.

CREATE TABLE IF NOT EXISTS `Weekdays` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(50) NOT NULL DEFAULT '', 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 ; 

INSERT INTO `Weekdays` (`id`, `name`) VALUES 
(1, 'Monday'), 
(2, 'Tuesday'), 
(3, 'Wednesday'), 
(4, 'Thursday'), 
(5, 'Friday'), 
(6, 'Saturday'), 
(7, 'Sunday'), 
(8, 'Monday'), 
(9, 'Tuesday'), 
(10, 'Wednesday'), 
(11, 'Thursday'), 
(12, 'Friday'), 
(13, 'Saturday'), 
(14, 'Sunday'); 

Я побежал запрос с переменной, которая определяется начальной точки в последовательности и используется объединение, чтобы получить номер заказа на дни.Например, чтобы начать распечатку в среду, я следующее:

SELECT @startnum := MIN(id) FROM Weekdays WHERE name='Wednesday'; 
SELECT * FROM Events INNER JOIN (SELECT id as weekdaynum, name as dayname FROM Weekdays WHERE id>(@startnum-1) AND id<(@startnum+7)) AS s2 ON s2.dayname=Events.day ORDER BY weekdaynum; 

Я надеюсь, что это поможет кому-то, кто натыкается на этот пост.

6

Почему не это?

ORDER BY (
    CASE DAYOFWEEK(dateField) 
    WHEN 1 THEN 7 ELSE DAYOFWEEK(dateField) 
    END 
) 

Я считаю, что заказы с понедельника по воскресенье ...

+1

Приобретено, потому что это работает для моего проекта, но имейте в виду, что это должно быть 1 ТОГДА 7. – BClaydon

-1

Если вы попытаетесь это сделать, он должен работать:

SELECT ename, TO_CHAR(hiredate, 'fmDay') as "Day" 
FROM my_table 
ORDER BY MOD(TO_CHAR(hiredate, 'D') + 5, 7) 
0

нашел еще один способ, который работает для меня:

SELECT LAST_NAME, HIRE_DATE, TO_CHAR(HIRE_DATE, 'fmDAY') as 'Day' FROM EMPLOYEES 
ORDER BY TO_CHAR(HIRE_DATE, 'd');  

Надеюсь, это поможет

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