Используя Oracle SQL, как я могу получить рабочие дни (понедельник-воскресенье), используя их ранг (1-7)? - PullRequest
0 голосов
/ 16 октября 2018

Используя Oracle, вот моя проблема:

Что у меня есть:

Число от 1 до 7.

ЧтоЯ хочу:

1 = понедельник, 2 = вторник ...

Что я сделал до сих пор:

DECODE (myVar,1, «Понедельник», 2, «Вторник», ...)

Я, конечно, подумал о написании функции, но я хотел бы знать, нет ли собственного способа сделать это.

РЕДАКТИРОВАТЬ: Поскольку это кажется неясным, я хочу родной способ сделать это без использования DECODE или CASE.

Большое спасибо.

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Следующая формула произведет то, что вы хотите:

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

Чтобы использовать, замените параметр: DAY_OF_WEEK на любое значение, которое вы хотите, и он вернет день недели.

0 голосов
/ 16 октября 2018

Вы можете попробовать использовать функцию to_char с аргументами Day и D для переменной даты, как показано ниже:

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 Demo

PS благодаря @Matthew McPeakЯ понимаю, что возвращаемое значение для to_char(<date>,'D') может отличаться от TERRITORY, например, оно отличается от того, установлен ли параметр NLS_TERRITORY "UNITED KINGDOM" или "AMERICAN_AMERICA".

0 голосов
/ 16 октября 2018

это, безусловно, будет работать, так как вы задали функцию без декодирования или регистра:

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
0 голосов
/ 16 октября 2018

TO_DATE имеет форматную маску, которая позволяет вам создавать дату из числового дня недели.Тогда вы можете получить название дня недели из этого.Однако для этого требуется ввод строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...