我有一些数据可以显示我的工人的班次跨度详细信息。我正在尝试找出一种方法,如果有的话,将跨度的第一天startdaynum
设置为1,然后在此之后适当地将任何进行中的enddaynum
或startdaynum
标记为2如果开始日期/时间或结束日期/时间是开始后的1天,或者3,如果日期是开始后的2天,依此类推。
下面我有一些示例数据,除了我手动填充的startdaynum
和enddaynum
列以显示我要实现的目标以外,所有都是真实数据。最后一行shiftsegmentid
对于每一行都是唯一的。倒数第二列shiftcodeid
对于每个班次都是唯一的。这样一来,我们就可以确定正在评估的行是班次的前一行还是第一行的延续,如果可以通过分析来完成的话。
前2行均为1个班次,所有开始结束日期均相同。第二两行是1个班次,第一个结束日期是第一个开始日期的第二天,所以我要startdaynum=1
但enddate=2
。第2行都是该轮班的第一个开始日期之后的第二天,因此显示的应该为startdaynum=2
和enddate=2
,
NAME DESCRIPTION TYPE STARTDAYNUM STARTTIME ENDDAYNUM ENDTIME SHECDHOURS SKILLSANDCERTS TRANSFER SHIFTCODEID SHIFTSEGMENTID
------- ----------- -------- ----------- ------------------- --------- ------------------- ---------- -------------- ------------ ----------- --------------
1009ABC Pattern 1 Transfer 1 01/01/1900 05:00 am 1 01/01/1900 01:30 pm 8.5 ///800505/// 3050 4052
1009ABC Pattern 1 Transfer 1 01/01/1900 01:30 pm 1 01/01/1900 02:30 pm 1 ///800855/// 3050 4053
1009XYZ Pattern 2 Transfer 1 01/01/1900 05:00 pm 2 01/02/1900 01:30 am 8.5 ///800505/// 3070 4072
1009XYZ Pattern 2 Transfer 2 01/02/1900 01:30 am 2 01/02/1900 02:30 am 1 ///800855/// 3070 4073
答案 0 :(得分:3)
根据示例数据和注释,开始时间和结束时间列已经包含了您在标称日期部分中寻找的信息,因此您无需做任何复杂的事情即可找到相邻记录等。
您可以使用:
extract(day from starttime) as startdaynum
和
extract(day from endtime) as enddaynum
演示:
with your_table (name, description, type, starttime, endtime, shecdhours, skillsandcerts, transfer, shiftcodeid, shiftsegmentid) as (
select '1009ABC', 'Pattern 1', 'Transfer', to_date('01/01/1900 05:00 am', 'MM/DD/YYYY HH:MI am'), to_date('01/01/1900 01:30 pm', 'MM/DD/YYYY HH:MI am'), 8.5, null, '///800505///', 3050, 4052 from dual
union all
select '1009ABC', 'Pattern 1', 'Transfer', to_date('01/01/1900 01:30 pm', 'MM/DD/YYYY HH:MI am'), to_date('01/01/1900 02:30 pm', 'MM/DD/YYYY HH:MI am'), 1, null, '///800855///', 3050, 4053 from dual
union all
select '1009XYZ', 'Pattern 2', 'Transfer', to_date('01/01/1900 05:00 pm', 'MM/DD/YYYY HH:MI am'), to_date('01/02/1900 01:30 am', 'MM/DD/YYYY HH:MI am'), 8.5, null, '///800505///', 3070, 4072 from dual
union all
select '1009XYZ', 'Pattern 2', 'Transfer', to_date('01/02/1900 01:30 am', 'MM/DD/YYYY HH:MI am'), to_date('01/02/1900 02:30 am', 'MM/DD/YYYY HH:MI am'), 1, null, '///800855///', 3070, 4073 from dual
)
select name,
description,
extract(day from starttime) as startdaynum,
to_char(starttime, 'HH:MI am') as starttime,
extract(day from endtime) as enddaynum,
to_char(endtime, 'HH:MI am') as endtime,
shecdhours,
skillsandcerts,
transfer,
shiftcodeid,
shiftsegmentid
from your_table;
NAME DESCRIPTI STARTDAYNUM STARTTIM ENDDAYNUM ENDTIME SHECDHOURS SKILLSANDCERTS TRANSFER SHIFTCODEID SHIFTSEGMENTID
------- --------- ----------- -------- ---------- -------- ---------- -------------- ------------ ----------- --------------
1009ABC Pattern 1 1 05:00 AM 1 01:30 PM 8.5 ///800505/// 3050 4052
1009ABC Pattern 1 1 01:30 PM 1 02:30 PM 1 ///800855/// 3050 4053
1009XYZ Pattern 2 1 05:00 PM 2 01:30 AM 8.5 ///800505/// 3070 4072
1009XYZ Pattern 2 2 01:30 AM 2 02:30 AM 1 ///800855/// 3070 4073