ORACLE求大神帮我解决一下sql

一丁丁点的爆炸头 2016-11-29 01:46:14
SELECT SUBSTR(CRTDATE, 1, 10), NOTPERFECT_USER, AVG(EVERYDAY) EVERYDAY
FROM (SELECT AP.CRTDATE,
CASE
WHEN AP.NOTPERFECT_USER IS NOT NULL THEN
AP.NOTPERFECT_USER
ELSE
AP.OVERBOOKINGUSER
END NOTPERFECT_USER,
CASE
WHEN NOTPERFECT_TIME IS NOT NULL THEN
(SELECT (TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd hh24:mi:ss') -
TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60
FROM DUAL)
ELSE
(SELECT (TO_DATE(AP.OVERBOOKINGDATE, 'yyyy-mm-dd hh24:mi:ss') -
TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60
FROM DUAL)
END EVERYDAY
FROM EXP_BOOKAPD AP
WHERE AP.RECSTS = '1')
GROUP BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10)
ORDER BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10);


这个是我获取2个时间相减后的分组的平均值显示出来,现在想做的是AP.NOTPERFECT_TIME和AP.OVERBOOKINGDATE满足以下逻辑,只算工作时间。。排除节假日。如果是工作日的。从上午9点到11点半。从下午1点到下午5点半算工作日。比如上传的时间是11点30.打单员下午1点1分打的单子。那么这票的打单用时就是1分钟。
...全文
221 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
js14982 2016-11-29
  • 打赏
  • 举报
回复
加你了看到没,报错加引号between '09:00' and '11:30'
  • 打赏
  • 举报
回复
你私信的QQ是我注册的名字 我的QQ:459787120 你加我下 另外我运行了一下你刚才给我的代码 between这个地方缺少关键字
js14982 2016-11-29
  • 打赏
  • 举报
回复
SELECT SUBSTR(CRTDATE, 1, 10), NOTPERFECT_USER, AVG(EVERYDAY) EVERYDAY
  FROM (SELECT AP.CRTDATE,
               nvl(AP.NOTPERFECT_USER,AP.OVERBOOKINGUSER) NOTPERFECT_USER,
               case when nvl(AP.NOTPERFECT_USER,AP.OVERBOOKINGUSER) not in (select HL_DATE FROM HOLIDAY)
                     and (substr(AP.NOTPERFECT_TIME,12,5) between 09:00 and 11:30) 
                     and (substr(AP.CRTDATE,12,5) between 13:00 and 17:30)
               then 
TO_DATE(nvl(AP.NOTPERFECT_USER,AP.OVERBOOKINGUSER), 'yyyy-mm-dd hh24:mi:ss') - TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60 - 90
               else 
               TO_DATE(nvl(AP.NOTPERFECT_USER,AP.OVERBOOKINGUSER), 'yyyy-mm-dd hh24:mi:ss') - TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60
             end EVERYDAY
          FROM EXP_BOOKAPD AP
         WHERE AP.RECSTS = '1')
 GROUP BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10)
 ORDER BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10);
这个语句你先看一下,nvl(AP.NOTPERFECT_USER,AP.OVERBOOKINGUSER) not in (select HL_DATE FROM HOLIDAY)这个地方可能需要转格式,否则匹配不到数据的
js14982 2016-11-29
  • 打赏
  • 举报
回复
qq私信给你了,另外你的表结构和日期数据格式说明一下
  • 打赏
  • 举报
回复
方便留下您的QQ吗?我加您讨论下。
  • 打赏
  • 举报
回复
我转换成to_char后包的错误是ORA-01830: 日期格式图片在转换整个输入字符串之前结"
js14982 2016-11-29
  • 打赏
  • 举报
回复
第二,你的标量子查询肯定用的不对,你这个应该会报一个,单行返回多行值的错误。
js14982 2016-11-29
  • 打赏
  • 举报
回复
首先,你的TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd') 和你TO_DATE(AP.NOTPERFECT_TIME, 'hh24:mi:ss') 这些都不对,你to_date转换成日期格式,无论怎样格式都是 年-月-日-小时-分-秒,不会只显示你要的时分秒,你可能需要再转成to_char
  • 打赏
  • 举报
回复
其中AP.NOTPERFECT_TIME和AP.OVERBOOKINGDATE就是打单的时间,一个为Null的话就去另外一个 crtdate就是创建的时间 。创建的时间一定比打单的时间小。比如AP.NOTPERFECT_TIME不为null ,值为2016-11-28 15:30:26操作过 ,创建的时间是2016-11-28 15:15:00 这个时间。
  • 打赏
  • 举报
回复
其中的 CASE
WHEN (SELECT COUNT(*)
FROM HOLIDAY H
WHERE H.HL_DATE =
(TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd'))) = 0 holiday中存的是2016年所有的假日包括周末个调休的日期。
  • 打赏
  • 举报
回复
我的意思是当上面的2个字段是工作日并且是9:00-11.30下午13:00到17:30才会进行想减的操作,然后相减的时候 如果是(AP.NOTPERFECT_TIME是11:30,AP.CRTDATE是13:01那相减的时候就要是1分钟。这边是我刚写的代码不知道对不对SELECT SUBSTR(CRTDATE, 1, 10), NOTPERFECT_USER, AVG(EVERYDAY) EVERYDAY
FROM (SELECT AP.CRTDATE,
CASE
WHEN AP.NOTPERFECT_USER IS NOT NULL THEN
AP.NOTPERFECT_USER
ELSE
AP.OVERBOOKINGUSER
END NOTPERFECT_USER,
CASE
WHEN NOTPERFECT_TIME IS NOT NULL THEN
CASE
WHEN (SELECT COUNT(*)
FROM HOLIDAY H
WHERE H.HL_DATE =
(TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd'))) = 0 AND
((TO_DATE(AP.NOTPERFECT_TIME, 'hh24:mi:ss') BETWEEN
'09:00:00' AND '11:30:00') OR
(TO_DATE(AP.NOTPERFECT_TIME, 'hh24:mi:ss') BETWEEN
'13:00:00' AND '17:30:00')) THEN
(SELECT (TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd hh24:mi:ss') -
TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60
FROM DUAL)
END
ELSE (SELECT (TO_DATE(AP.OVERBOOKINGDATE,
'yyyy-mm-dd hh24:mi:ss') -
TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60
FROM DUAL) END EVERYDAY
FROM EXP_BOOKAPD AP
WHERE AP.RECSTS = '1')
GROUP BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10)
ORDER BY NOTPERFECT_USER, SUBSTR(CRTDATE, 1, 10);
js14982 2016-11-29
  • 打赏
  • 举报
回复
case when (substr(AP.NOTPERFECT_TIME,12,5) between 09:00 and 11:30) and (substr(AP.CRTDATE,12,5) between 13:00 and 17:30) then TO_DATE(AP.NOTPERFECT_TIME, 'yyyy-mm-dd hh24:mi:ss') - TO_DATE(AP.CRTDATE, 'yyyy-mm-dd hh24:mi:ss')) * 24 * 60 - 90
js14982 2016-11-29
  • 打赏
  • 举报
回复
报什么错? 还有测试数据给点
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧