在MySQL中按day_of_week排序

时间:2009-07-14 17:52:34

标签: mysql sql sql-order-by dayofweek

如何通过包含星期几名称的varchar列来订购mysql结果?

请注意,MONDAY应该先行,而不是SUNDAY。

10 个答案:

答案 0 :(得分:31)

按照Williham Totland的建议重新设计列,或者进行一些字符串解析以获取日期表示。

如果列包含星期几,那么您可以这样做:

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

答案 1 :(得分:6)

为什么不呢?

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

我相信周一到周日这个订单......

答案 2 :(得分:3)

我认为没有重新设计列来使用枚举,除了在你把它们拿出来之后对结果进行排序之外,没有太多的事要做。

编辑:一个脏黑客当然要添加另一个带有id:工作日对的表,并使用连接或选择选择伪造枚举。

答案 3 :(得分: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;

使用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;

您还可以隐藏存储过程中从name到int的转换详细信息。

答案 4 :(得分:1)

找到了另一种方法,您可以在一周前撤销订单

ORDER BY date_format(date_name, '%w') DESC;

答案 5 :(得分:0)

另一种方法是创建另一个包含那些日子的表和一个按顺序排序的表,在搜索时加入该表,然后按顺序排序。当然,不建议加入varchar。

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

SELECT * FROM WhateverTable LEOF JOIN DaysOFWeek on DaysOFWeek.day = WhateverTable.dayColumn 订购DaysOfWeek.id

(道歉,如果这不正确;我最近一直坚持使用SQL服务器)

同样,不推荐这样做,但是如果你不能改变你已经获得的数据......如果dayColumn字段中存在非标准值,这也会有效。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我意识到这是一个旧帖子,但是当它在某些搜索时间到谷歌的顶部时,我会用它来分享我的方法。

我想要与原始问题相同的结果,但另外我想要从一周的当天开始对结果进行排序,然后在其余时间内进行。

我创建了一个单独的表,其中列出了两周的日期,因此无论您从哪一天开始,都可以执行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;

我希望这可以帮助那些偶然发现这篇文章的人。

答案 8 :(得分:0)

找到另一种适合我的方式:

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

希望有所帮助

答案 9 :(得分:-1)

如果您尝试这样做,它应该有效:

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