Упорядочить по day_of_week в MySQL - PullRequest
12 голосов
/ 14 июля 2009

Как я могу заказать результат mysql по столбцу varchar, который содержит название дня недели?

Обратите внимание, что понедельник должен идти первым, а не воскресенье.

Ответы [ 9 ]

31 голосов
/ 14 июля 2009

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

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

ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
6 голосов
/ 23 июля 2013

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

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

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

3 голосов
/ 14 июля 2009

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

Редактировать: Грязный хак - это, конечно, добавление еще одной таблицы с парами id: weekday и использованием объединений или select в select для подделки перечисления.

1 голос
/ 14 июля 2009

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

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;

Использование if является еще более общим и сложным:

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;

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

0 голосов
/ 11 октября 2017

Нашел другой способ, который у меня работает:

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

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

0 голосов
/ 01 июня 2014

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

SELECT ename, TO_CHAR(hiredate, 'fmDay') as "Day" 
FROM my_table
ORDER BY MOD(TO_CHAR(hiredate, 'D') + 5, 7)
0 голосов
/ 19 февраля 2012

Я понимаю, что это старая ветка, но, поскольку она подходит к началу 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;

Надеюсь, это поможет тому, кто наткнется на этот пост.

0 голосов
/ 16 июля 2009

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

0 голосов
/ 14 июля 2009

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

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

ВЫБРАТЬ * ИЗ ВСЕГО СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ к DaysOFWeek на DaysOFWeek.day = WhwhatTable.dayColumn ЗАКАЗАТЬ ПО DaysOfWeek.id

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

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

...