ORACLE查询条件基于系统时间

时间:2017-08-31 02:12:33

标签: oracle

我在下面有一个Oracle查询:

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')
                                         )
            )
    )

Shift有2种类型:

Night
Morning

现在我希望检测到oracle查询,如果系统时间从08:0019:29然后设置为早晨,那么晚上。

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

有可能吗?

3 个答案:

答案 0 :(得分: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 - 这取决于你追踪时间的准确程度。

答案 1 :(得分: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

答案 2 :(得分:0)

最简单的方法是编写函数返回日/夜班并将其包含在您的查询中

python fileName.py -file fileName.txt