2017-08-31 134 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 - 這取決於你跟蹤時間的精確程度。