首页 文章

Oracle sql按当天排序

提问于
浏览
0

我试图根据订单排序日期:周六,周日,周一,周二,周三,周四,周五 . 我正在尝试使用案例:

select day,
 CASE day
  WHEN  1 THEN 1
  WHEN  2 THEN 2
  WHEN  3 THEN 3
  WHEN  4 THEN 4
  WHEN  5 THEN 5
  WHEN  6 THEN 6
  WHEN  7 THEN 7
  else 0
  END as day_nr
from week where day in (1,2,3,4,5,6,7)
order by day_nr asc

当我选择一周中的所有日子时,这是可以的 . 但如果我只想在1,5,6那天订购不正确 . 获得第一天-Monday . 如何进行?

2 回答

  • 1

    如果您尝试按星期几对一组日期进行排序,而星期六是第一天,则考虑按修改日期排序:

    create table t1(my_date date);
    insert into t1
    select trunc(sysdate)+rownum
    from dual
    connect by level <= 20
    
    select
      my_date,
      to_char(my_date,'Day'),
      to_char(my_date,'D')
    from
      t1
    order by
      to_char(my_date + 1,'D');
    

    http://sqlfiddle.com/#!4/5940b/3

    缺点是它不是很直观,所以如果使用这种方法,请添加代码注释 .

    编辑:如果您有一个数字列表,请通过带有列表转换的案例陈述进行排序:

    case day
      when 1 then 3
      when 2 then 4
      when 3 then 5
      when 4 then 6
      when 5 then 7
      when 6 then 1 -- saturday
      when 7 then 2
    end
    

    ......或者更紧凑,但不那么直观:

    case
      when day <= 5 then day + 2
      else               day - 5
    end
    
    order by case
    
  • 1

    在Oracle第1天默认为星期日 .

    SELECT * FROM
    (
     SELECT trunc(sysdate) + LEVEL-1 my_dt
          , TO_CHAR(trunc(sysdate) + LEVEL-1, 'DY') Wk_Day
          , TO_CHAR(trunc(sysdate) + LEVEL-2, 'D' ) Day#
       FROM dual 
     CONNECT BY LEVEL <= 10
     )
    WHERE Day# IN (1,5,6)
    ORDER BY my_dt, Day#
    /
    
    MY_DT    WK_DAY    DAY#
    ------------------------
    5/10/2013    FRI    5
    5/11/2013    SAT    6
    5/13/2013    MON    1
    5/17/2013    FRI    5
    5/18/2013    SAT    6
    

相关问题