【问题标题】:Oracle sql sort week days by current dayOracle sql 按当天排序工作日
【发布时间】:2013-05-04 21:26:19
【问题描述】:

我正在尝试根据以下顺序对日期进行排序:周六、周日、周一、周二、周三、周四、周五。 我正在尝试使用案例:

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 天的顺序是不正确的。获取第一天 - 星期一。如何进行?

【问题讨论】:

  • 你好,发布错误的查询和想要的结果

标签: sql oracle


【解决方案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 语句排序:

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 

【讨论】:

  • 你好大卫,我在表格中使用数字类型来存储日期。我对 sql fiddle 不满意.. 使用 oracle。
  • 什么数字代表星期几?
  • 1-周一、2-周二、3-周三、4-周四、5-周五、6-周六、7-周日。如果我只有在哪里条件:(1,5,6)中的哪一天,今天是星期五,顺序是:5,6,1
  • 或者更紧凑,如果我们在打高尔夫球的话 :) : MOD(day+2, 7)
【解决方案2】:

在 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

【讨论】:

  • 这取决于 NLS 设置。为了保证 Sunday=1,最好对 nlsparam 进行硬编码,例如TO_CHAR(date,'D','NLS_DATE_LANGUAGE=ENGLISH')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多