代码之家  ›  专栏  ›  技术社区  ›  Bogdan Gusiev

在MySQL中按周的天数排序

  •  12
  • Bogdan Gusiev  · 技术社区  · 15 年前

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

    请注意,星期一应该排在第一位,而不是星期天。

    9 回复  |  直到 7 年前
        1
  •  31
  •   ceejayoz    15 年前

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

    如果列 只有 包含星期几,则可以执行以下操作:

    ORDER BY FIELD(<fieldname>, 'MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY');
    
        2
  •  6
  •   BritishWerewolf TalOrlanczyk    7 年前

    为什么不呢?

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

    我相信这是星期一到星期天的命令…

        3
  •  3
  •   Williham Totland    15 年前

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

    编辑:一个脏的hack当然是添加另一个id:weekday对的表,并使用join或select-in selects来伪造枚举。

        4
  •  1
  •   niteria    15 年前

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

    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转换的详细信息。

        5
  •  0
  •   Dave    15 年前

    另一种方法是创建另一个具有这些日期的表,并使用int排序,在搜索时加入该表,然后按它排序。当然,不建议加入varchar。

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

    从可转换的内容中选择*。 left join daysofweek on daysofweek.day=whatevertable.daycolumn 按daysofweek.id排序

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

    同样,这是不推荐的,但是如果你不能改变你已经得到的数据…如果daycolumn字段中存在非标准值,这也会起作用。

        6
  •  0
  •   shantanuo    15 年前

    …按日期排序格式(订单日期,'%w')=0,日期格式(订单日期,'%w');

        7
  •  0
  •   John Hawkins    13 年前

    我意识到这是一条古老的线索,但当它在某些搜索时间到达谷歌的顶端时,我会用它来分享我的方法。

    我希望得到与原始问题相同的结果,但除此之外,我还希望从一周中的当前日期开始对结果进行排序,然后在其余时间继续排序。

    我创建了一个单独的表,其中列出了超过两周的天数,这样无论从哪一天开始,都可以连续运行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
  •   Jensoo    7 年前

    找到另一个适合我的方法:

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

    希望它有帮助

        9
  •  -1
  •   BritishWerewolf TalOrlanczyk    7 年前

    如果您尝试这样做,它应该可以工作:

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