使用 Oracle SQL,我如何使用他们的排名 (1-7) 获得工作日(周一至周日)?



使用Oracle,这是我的问题:

我有什么:

介于 1 和 7 之间的数字。

我想要什么:

1 = 星期一,2 = 星期二...

到目前为止我做了什么:

解码(myVar,1,'星期一',2,'星期二',...(

我当然想过编写一个函数,但我想知道是否没有本机方法可以做到这一点。

编辑:由于似乎不清楚,我想要一种本机方法来执行此操作,而无需使用解码或CASE。

多谢。

您可以尝试将to_char函数与日期变量的DayD参数一起使用,如下所示:

SQL> var day_nr number;
SQL> exec :day_nr := 1;
PL/SQL procedure successfully completed
day_nr
---------
1
SQL> alter session set NLS_TERRITORY="UNITED KINGDOM";
SQL> with t(day,day_nr) as
2  (
3   select to_char(level + sysdate,'Day','NLS_DATE_LANGUAGE=ENGLISH'),
4          to_char(level + sysdate,'D')
5     from dual
6  connect by level <= 7
7  )
8  select day
9    from t
10   where day_nr = :day_nr;
DAY
---------
Monday

例如,如果您用1代替:day_nr,则会得到Monday等。

Rextester 演示

附言感谢@Matthew McPeak,我意识到to_char(<date>,'D')的返回值可能与TERRITORY不同,例如,无论参数设置为"UNITED ESTATE"还是"AMERICAN_AMERICA"NLS_TERRITORY都不同。

以下公式将产生您想要的内容:

SELECT TO_CHAR(TRUNC(SYSDATE, 'IW') +
(CAST(TO_CHAR(TRUNC(SYSDATE, 'IW'), 'D') AS NUMBER) +
:DAY_OF_WEEK - 3), 'Day')
FROM DUAL

若要使用,请将 :D AY_OF_WEEK 参数替换为所需的任何值,它将返回星期几。

TO_DATE有一个format_mask,允许您从星期几创建日期。然后你可以从中得到工作日的名字。但是,它需要字符串输入。

这肯定会起作用,因为您询问了一个没有解码或大小写的函数:

declare
a varchar(20);
b varchar(20);
c varchar(20);
d varchar(20);
e varchar(20);
f varchar(20);
g varchar(20);
h varchar(20);
i number;
begin
i:=&i;
SELECT COALESCE((select 'null' from dual where i<>1),'MONDAY')into a from dual;
SELECT COALESCE((select 'null' from dual where i<>2),'TUEDAY')into b from dual;
SELECT COALESCE((select 'null' from dual where i<>3),'WEDNESDAY') into c from dual;
SELECT COALESCE((select 'null' from dual where i<>4),'THURDAY') into d from dual;
SELECT COALESCE((select 'null' from dual where i<>5),'FRIDAY')into e from dual;
SELECT COALESCE((select 'null' from dual where i<>6),'SATURDAY')into f from dual;
SELECT COALESCE((select 'null' from dual where i<>7),'SUNDAY')into g from dual;
DBMS_OUTPUT.PUT_LINE(a||b||c||d||e||f||g);
end;
/

对于 4 的输入,输出为:

null  null null  THURDAY  null null null

最新更新