求帮忙改一个ORACLE的SQL

SELECT

S.OT_START_DATETIME / (1000 * 60 * 60 * 24)+ TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') AS 有效加班开始时间,

S.OT_END_DATETIME / (1000 * 60 * 60 * 24)+ TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') AS 有效加班结束时间,

FROM

V3XUSER.ATT_OVERTIME_DETAILS S

----------------上面的原来的

现在需要增加一列【有效加班时间】 为上面两列的差值 单位:小时 (S.OT_END_DATETIME-S.OT_START_DATETIME)/ (1000 * 60 * 60 )

要求:

1.【有效加班开始时间】到【有效加班结束时间】 这两列的值 如果其中有当天12点到13点之间的情况 需要加班时间减去一小时 比如说他9点上班 下午六点下班 就是9减去1个小时 如果下午6点上班 下午八点半下班就是2.5个小时

2.同时向下取整 只能是0.5为一个计数单位 

举例:加班2小时 加班2.5小时 加班3小时

谢谢

image.png原始数据是这种形式 通过我上面的SQL可以转换成image.png

求帮助

callie 发布于 2022-6-23 16:12 (编辑于 2022-6-23 16:50)
1min目标场景问卷 立即参与
回答问题
悬赏:16 F币 5人赏过 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共2回答
最佳回答
1
CD20160914Lv8专家互助
发布于2022-6-23 16:17(编辑于 2022-6-23 17:40)

select 

tmp.开始,

tmp.结束,

tmp.减小时与不减,

--nvl(instr(tmp.减小时与不减,'.')) as qq,

--substr(tmp.减小时与不减,1,instr(tmp.减小时与不减,'.')-1)+0.5 as tc

case when instr(tmp.减小时与不减,'.')=0 then tmp.减小时与不减

when substr(tmp.减小时与不减,instr(tmp.减小时与不减,'.')+1,1)*1>=5 then substr(tmp.减小时与不减,1,instr(tmp.减小时与不减,'.')-1)+0.5 else 

substr(tmp.减小时与不减,1,instr(tmp.减小时与不减,'.')-1)+0 end as 判断

from (

select 

t.开始,

t.结束,

round((t.结束-t.开始)*24-1) as 小时,

case when to_char(t.开始,'HH24')*1<=11 and to_char(t.结束,'HH24')*1>=13 then (t.结束-t.开始)*24-1 else (t.结束-t.开始)*24 end as 减小时与不减

from (

select 1655647825000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 结束,

1655601025000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 开始

 from dual

union all

select 1652963685000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 结束,

1652954400000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 开始

 from dual

union all

select 1655637745000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 结束,

1655622625000 / (1000 * 60 * 60 * 24)+TO_DATE('1970-01-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS') as 开始

 from dual

) t

) tmp

image.png

  • callie callie(提问者) 我补充了问题 请帮忙再看一下吧
    2022-06-23 16:25 
  • CD20160914 CD20160914 回复 callie(提问者) 你的原始数据是时间戳,你转成了标准的时间格式,现在要判断这个标准的时间,如果开始与结束里面有12点-13点的时候就要减1?
    2022-06-23 16:28 
  • callie callie(提问者) 回复 CD20160914 就是时间段包含了12-13点就需要减一
    2022-06-23 16:30 
  • CD20160914 CD20160914 回复 callie(提问者) 稍等,我写一个语句。
    2022-06-23 16:35 
  • callie callie(提问者) 回复 CD20160914 有时间的话请帮忙解答谢谢
    2022-06-23 17:01 
最佳回答
0
Z4u3z1Lv6专家互助
发布于2022-6-23 16:19

oracle不熟  建议你用存储过程吧

  • 2关注人数
  • 470浏览人数
  • 最后回答于:2022-6-23 17:40
    请选择关闭问题的原因
    确定 取消
    返回顶部