Получить номер дня, когда у меня есть только день недели - PullRequest
0 голосов
/ 31 мая 2018

Меня заинтересовал ответ MT0 на этот вопрос с использованием интервалов и дат.Я работал, пытаясь найти другой способ ответить на вопрос, и я начал задумываться о чем-то.

Используя только интервалы, которые установил MT0:

with weekly_shifts(shift_date,start_time,end_time) as
(SELECT 'MON', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL UNION ALL
 SELECT 'TUE', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL UNION ALL
 SELECT 'WED', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL UNION ALL
 SELECT 'THU', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL UNION ALL
 SELECT 'FRI', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL)

Если все, что у меня естьдни недели в формате DY (MON,TUE,WED), и я хочу получить числовую версию дня (2,3,4), какой самый простой способ сделать это?

Моя единственная идеячто я мог придумать было что-то вроде этого:

select to_char(next_day(sysdate,shift_date),'D') SHIFT_NUM,
       weekly_shifts.*
from weekly_shifts

1 Ответ

0 голосов
/ 31 мая 2018

Одна из возможностей - использовать row_number () и rownum.Необходимо тщательно протестировать, поскольку ваш пример, вероятно, упрощен:

with weekly_shifts
AS
(
SELECT 'MON' shift_day, INTERVAL '09:00' HOUR TO MINUTE start_time, INTERVAL '18:00' HOUR TO MINUTE end_time FROM DUAL 
UNION ALL
SELECT 'TUE', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'WED', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'THU', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'FRI', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL
UNION ALL
SELECT 'MON' shift_day, INTERVAL '09:00' HOUR TO MINUTE start_time, INTERVAL '18:00' HOUR TO MINUTE end_time FROM DUAL 
UNION ALL
SELECT 'TUE', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'WED', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'THU', INTERVAL '10:00' HOUR TO MINUTE, INTERVAL '19:00' HOUR TO MINUTE FROM DUAL 
UNION ALL
SELECT 'FRI', INTERVAL '09:00' HOUR TO MINUTE, INTERVAL '18:00' HOUR TO MINUTE FROM DUAL
)
SELECT ROW_NUMBER() OVER (PARTITION BY reset_week ORDER BY reset_week)+1 day_number, shift_day, start_time, end_time, reset_week
  FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY shift_day ORDER BY rownum) reset_week, shift_day, start_time, end_time FROM weekly_shifts
ORDER BY rownum
)
ORDER BY reset_week
/

Вывод:

day_number  shift_day   start_time              end_time                reset_week
2           MON         +00 09:00:00.000000     +00 18:00:00.000000     1
3           TUE         +00 10:00:00.000000     +00 19:00:00.000000     1
4           WED         +00 09:00:00.000000     +00 18:00:00.000000     1
5           THU         +00 10:00:00.000000     +00 19:00:00.000000     1
6           FRI         +00 09:00:00.000000     +00 18:00:00.000000     1
2           MON         +00 09:00:00.000000     +00 18:00:00.000000     2
3           TUE         +00 10:00:00.000000     +00 19:00:00.000000     2
4           WED         +00 09:00:00.000000     +00 18:00:00.000000     2
5           THU         +00 10:00:00.000000     +00 19:00:00.000000     2
6           FRI         +00 09:00:00.000000     +00 18:00:00.000000     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...