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