繁体   English   中英

按 day_of_week 在 MySQL 订购

[英]Order by day_of_week in MySQL

如何按包含星期几名称的 varchar 列对 mysql 结果进行排序?

请注意,MONDAY 应该排在第一位,而不是 SUNDAY。

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

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

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

为什么不是这个?

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

我相信这是周一到周日的订单......

我认为除了重新设计列以使用枚举代替之外,除了在您得到结果后对结果进行排序之外,没有太多工作要做。

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

这看起来很乱,但仍然有效,而且看起来更通用:

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 的转换细节。

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

找到另一种方式,您可以颠倒顺序再见周

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

另一种方法是用那些日子和一个 int 创建另一个表来对它们进行排序,在搜索时加入该表,并按它排序。 当然,不建议加入 varchar。

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

SELECT * FROMWhateverTable LEFT JOIN DaysOFWeek on DaysOFWeek.day = WhatTable.dayColumn ORDER BY DaysOfWeek.id

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

同样,不建议这样做,但如果您无法更改已经获得的数据......如果 dayColumn 字段中存在非标准值,这也将起作用。

找到了另一种对我有用的方法:

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

希望能帮助到你

就我而言,由于可以用多种语言注册这些日子,因此根据Glen Solsberry的说法,为了获得正确的顺序,我这样做:

....
....
    ORDER BY 
    FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY'),
    FIELD(<fieldname>, 'LUNDI', 'MARDI', 'MERCREDI', 'JEUDI', 'VENDREDI', 'SAMEDI', 'DIMANCHE'),
    FIELD(<fieldname>, 'LUNES', 'MARTES', 'MIERCOLES', 'JUEVES', 'VIERNES', 'SABADO', 'DOMINGO'),
    FIELD(<fieldname>, 'MONTAGE', 'DIENSTAG', 'MITTWOCH', 'DENNERSTAG',  'FREITAG', 'SAMSTAG', 'SONNTAG')
    ;

不要忘记, <fieldname>在您的情况下是相关日期列的名称。

我看到...WHEN 1 THEN 7... 已发布,但应该是 WHEN 1 THEN 8。所以...

ORDER BY ( CASE DATEPART(DW, yourdatefield) WHEN 1 THEN 8 ELSE DATEPART(DW, yourdatefield) END )

否则星期日可能会早于星期六,因为星期日和星期六都等于 7。通过将星期日设置为 8,可以确保它在星期六之后。

我意识到这是一个旧线程,但是当它在某些搜索时间出现在 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;

我希望这对偶然发现这篇文章的人有所帮助。

如果你试试这个,它应该可以工作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM