模式中的天数

时间:2018-11-20 17:21:01

标签: sql oracle

我有一些数据可以显示我的工人的班次跨度详细信息。我正在尝试找出一种方法,如果有的话,将跨度的第一天startdaynum设置为1,然后在此之后适当地将任何进行中的enddaynumstartdaynum标记为2如果开始日期/时间或结束日期/时间是开始后的1天,或者3,如果日期是开始后的2天,依此类推。

下面我有一些示例数据,除了我手动填充的startdaynumenddaynum列以显示我要实现的目标以外,所有都是真实数据。最后一行shiftsegmentid对于每一行都是唯一的。倒数第二列shiftcodeid对于每个班次都是唯一的。这样一来,我们就可以确定正在评估的行是班次的前一行还是第一行的延续,如果可以通过分析来完成的话。

前2行均为1个班次,所有开始结束日期均相同。第二两行是1个班次,第一个结束日期是第一个开始日期的第二天,所以我要startdaynum=1enddate=2。第2行都是该轮班的第一个开始日期之后的第二天,因此显示的应该为startdaynum=2enddate=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

1 个答案:

答案 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