2017-08-31 137 views
0

下面我有一个Oracle查询:Oracle查询Where条件基础上的系统时间

select ltrim(ROUND((1-n/c)*100) || '%') as TOTAL 
from (select count(*) c 
     from WA_SEW_TBL_EMP_INFO 
     WHERE SHIFT = 'Morning') 
    , (SELECT COUNT(*) n 
     FROM (SELECT S.BADGEID_FK 
       FROM WA_SEW_TBL_EMP_INFO S 
       , WA_GA_TBL_EMPLOYEES E 
       WHERE S.BADGEID_FK = E.BADGEID 
       AND S.STATUS = 'Attend' 
       AND S.SHIFT = 'Morning' 
       AND S.BADGEID_FK NOT IN (SELECT EMPID 
             FROM WA_SEW_TBL_RESULTS 
             WHERE SYSTEM_DATE between to_date ('2017-08-31 07:00', 'YYYY-MM-DD HH24:MI') 
                  and to_date ('2017-08-31 19:29', 'YYYY-MM-DD HH24:MI') 
             ) 
      ) 
    ) 

转变有两个类型:

Night 
Morning 

现在我想Oracle查询检测,如果系统的时间从08:00直到19:29然后设置为早晨,否则晚上。

意味着我要WHERE SHIFT = 'system time condition from 08:00 until 19:29 then set shift to be Morning, else Night'

是否可以这样做呢?

+0

没有我们比深层嵌套的查询更好,没有解释表的目的,也没有样本数据。 – APC

回答

0

我认为你可以像这样的工作:

WITH TEST_DATETIME AS(
     SELECT TO_DATE('2017/08/31 10:15:24','YYYY/MM/DD HH24:MI:SS') DT FROM DUAL 
     UNION ALL 
     SELECT TO_DATE('2017/08/31 19:40:24','YYYY/MM/DD HH24:MI:SS') FROM DUAL 
     UNION ALL 
     SELECT SYSDATE FROM DUAL 
) 
SELECT CASE WHEN to_char(DT, 'hh24:mi:ss') > '08:00:00' AND to_char(DT, 'hh24:mi:ss') < '19:29:00' THEN 'Morning' ELSE 'Night' END AS NOON 
FROM TEST_DATETIME 
0

最简单的方法是编写函数返回日/夜班,包括它在查询

create or replace function find_shift(dat in date) return varchar2 
is 
dat2 date; 

treshhold1 date; 
treshhold2 date; 
ret varchar2(10); 
begin 
dat2:=to_date(to_char(dat, 'HH24:MI'),'HH24:MI'); 
treshhold1 := to_date('08:00','HH24:MI'); 
treshhold2 := to_date('19:29','HH24:MI'); 
if dat2>=treshhold1 and dat2<= treshhold2 then 
ret := 'Morning'; 
else 
ret := 'Night'; 
end if; 
return ret 
end; 
+0

您应该**编辑您的答案**以包含其他信息。评论部分适用于呃意见。特别是代码很难以这种压缩的不可读形式阅读。 – APC

1

此查询使用'sssss'日期面具这是午夜过后的秒数。然后你可以判断时间元素是否在你想要的范围内。

SELECT EMPID, 
     case when to_number(to_char(system_date, 'sssss')) 
      between 28800 -- 08:00:00 
      and 70140 -- 19:29:00 
      then 'Morning' 
     else 'Night' as SHIFT 
FROM WA_SEW_TBL_RESULTS 
where trunc(system_date) = date '2017-08-31' 

根据需要将此子查询插入到主查询中。

顺便说一下,我已经按照您指定的19:29:00关闭了秒数的范围。也许这应该是70199,把白天变成高达19:29:59 - 这取决于你跟踪时间的精确程度。