Sql 模式中的日数

Sql 模式中的日数,sql,oracle,Sql,Oracle,我有一些数据显示了我的员工的轮班时间细节。我试图找到一种方法,如果有,将跨度的第一天startdaynum确定为1,然后适当地将任何进程enddaynum或startdaynum标记为2,如果开始日期/时间或结束日期/时间是开始后1天,或者如果日期是开始后2天,诸如此类 下面我有一些示例数据,除了手动填充的startdaynum和enddaynum列,所有数据都是真实数据。最后一列shiftsegmentid对每一行都是唯一的。倒数第二列shiftcodeid对于每个班次都是唯一的。这样我们就可

我有一些数据显示了我的员工的轮班时间细节。我试图找到一种方法,如果有,将跨度的第一天
startdaynum
确定为1,然后适当地将任何进程
enddaynum
startdaynum
标记为2,如果开始日期/时间或结束日期/时间是开始后1天,或者如果日期是开始后2天,诸如此类

下面我有一些示例数据,除了手动填充的
startdaynum
enddaynum
列,所有数据都是真实数据。最后一列
shiftsegmentid
对每一行都是唯一的。倒数第二列
shiftcodeid
对于每个班次都是唯一的。这样我们就可以确定,我们正在评估的那一行是前一行的延续,还是移位的第一行,如果这可以用解析的方法来完成的话

前两行都是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

根据您的示例数据和注释,开始和结束时间列已经包含您在标称日期部分中查找的信息,因此您不需要做任何复杂的工作来查找相邻记录等

您只需使用:

extract(day from starttime) as startdaynum

演示:


根据您的示例数据和注释,开始和结束时间列已经包含您在标称日期部分中查找的信息,因此您不需要做任何复杂的工作来查找相邻记录等

您只需使用:

extract(day from starttime) as startdaynum

演示:


开始/结束时间的日期部分似乎是名义上的,从1900年开始设置;那么你要找的不是那些数字吗?我没想到,但这是有道理的。应用程序实际上不使用日期,因为班次只是可以应用于任何一天的时间。谢谢你的回复,我想你的建议会奏效的!开始/结束时间的日期部分似乎是名义上的,从1900年开始设置;那么你要找的不是那些数字吗?我没想到,但这是有道理的。应用程序实际上不使用日期,因为班次只是可以应用于任何一天的时间。谢谢你的回复,我想你的建议会奏效的@如果答案有助于解决问题或有助于得出逻辑结论,则sandsawks Upvote。@如果答案有助于解决问题或有助于得出逻辑结论,则sandsawks Upvote。
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