2016-05-23 25 views
3

有人可以幫我寫一個CASE查詢。使用列名PERFORM_DT_TM - 日期&時間格式 「MM-DD-YYYY HH-MI-SS」如何寫日期和時間轉移查詢?

表名PERFORM_RESULT

我想要的結果是這樣的:

BETWEEN'06:00:00'AND'14:29:59' THEN 'First Shift' 
BETWEEN'14:30:00'AND'22:59:59' THEN 'Second Shift' 
BETWEEN '23:00:00' AND'05:59:59' THEN 'Third Shift' 
ELSE 'UNKNOWN' 
+0

列PERF ORM_DT_TM是日期/時間類型? – scaisEdge

+0

我希望這是一個錯字... HH-MM-SS應該是HH-MI-SS,對不對?你不顯示月份而不是幾分鐘? – mathguy

回答

1

假設這是針對Oracle的,假設PERFORM_DT_TM列的數據類型爲DATE ...

我們可以使用TO_CHAR函數來格式化時間部分。例如:

TO_CHAR(t.perform_dt_tm,'HH24:MI') 

,我們可以做一個CASE表達字符串比較。例如:

SELECT CASE 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24:MI') >= '06:00' 
      AND TO_CHAR(t.perform_dt_tm,'HH24:MI') < '14:30' 
     THEN 'First Shift' 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24:MI') >= '14:30' 
      AND TO_CHAR(t.perform_dt_tm,'HH24:MI') < '23:00' 
     THEN 'Second Shift' 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24:MI') >= '23:00' 
      OR TO_CHAR(t.perform_dt_tm,'HH24:MI') < '06:00' 
     THEN 'Third Shift' 
     ELSE 'Unknown' 
     END AS which_shift 
    , t.perform_dt_tm 
    , ... 
    FROM ... t 

注意:這是基於這樣的假設,該列的數據類型是DATE,並認爲這是Oracle。如果列是不同的數據類型,那麼我們需要調整提取「時間」部分的方式。

TO_CHAR函數特定於Oracle。如果這是Oracle以外的數據庫,我們需要調整提取時間部分的表達式。 (例如爲MySQL DATE_FORMAT)


的等效結果可以被更簡明地獲得:

SELECT CASE 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24')  < '06:00' 
     THEN 'Third Shift' 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24:MI') < '14:30' 
     THEN 'First Shift' 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24')  < '23:00' 
     THEN 'Second Shift' 
     WHEN TO_CHAR(t.perform_dt_tm,'HH24')  < '24:00' 
     THEN 'Third Shift' 
     ELSE 'Unknown' 
     END AS which_shift 
    , t.perform_dt_tm 
    , ... 
    FROM ... t 
1

可以使用to_char(PERFORM_RESULT, 'HH24:MI')獲得從日期的小時和分鐘;這不需要秒。

23:00你需要檢查兩個範圍05:59,因爲BETWEEN不知道時鐘環繞,它只是在做一個文本比較。

SELECT CASE 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') BETWEEN '06:00' AND '14:29' THEN 'First Shift' 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') BETWEEN '14:30' AND '22:59' THEN 'Second Shift' 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') BETWEEN '23:00' AND '23:59' THEN 'Third Shift' 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') BETWEEN '00:00' AND '05:59' THEN 'Third Shift' 
    ELSE 'UNKNOWN' 
END 

您也可以利用這一案件被順序測試,以簡化它,因爲你沒有來檢查範圍的開始如果已被排除前一種情況的事實。

SELECT CASE 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') <= '05:59' THEN 'Third Shift'  
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') <= '14:29' THEN 'First Shift' 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') <= '22:59' THEN 'Second Shift' 
    WHEN to_char(PERFORM_DT_TM, 'HH24:MI') <= '23:59' THEN 'Third Shift' 
    ELSE 'UNKNOWN' 
END 
+0

是的,已經修復了。 – Barmar

+0

@mathguy當你調用'to_char'時,只會返回'22:59',秒數將被丟棄。 – Barmar

+0

是的,其實你是對的。我會刪除我的評論,以免誤導別人;我發現有人已經爲我的評論+1了,儘管它是錯誤的。 – mathguy

1

假設PERFORM_DT_TM是datetime數據類型(因爲它應該是),你並不需要一個格式模型像'MM-DD-YYYY'或相似;你最好使用數字比較而不是詞典。

當天的時間是PERFORM_DT_TM - trunc(PERFORM_DT_TM)trunc保持相同的日期,但將時間部分截斷回到00:00:00 AM,因此差異只是存儲在PERFORM_DT_TM中的日期時間的時間分量。但是,這個「時間分量」表示爲1天的一小部分;與小時比較,將小時除以24(或者,將時差乘以24;我將在下面說明第一個選擇)。

假設您的表名是MY_TABLE,可以編寫您的大小寫表達式(使用Oracle 11中提供的「with clause」)。1及以上)如下:

with p as (
     select PERFORM_DT_TM - trunc(PERFORM_DT_TM) as PERF_TM [, other columns] 
     from MY_TABLE 
    ) 
select [other columns, perhaps PERF_TM,] 
     case 
     when PERF_TM >= 6/24 and PERF_TM < 14.5/24 then "First Shift" 
     when PERF_TM >= 14.5/24 and PERF_TM < 23/24 then "Second Shift" 
     when PERF_TM <  6/24 or PERF_TM >= 23/24 then "Third Shift" 
     else            "Error/Unknown" 
     end as SHIFT 
from p; 
1

甲骨文設置

CREATE TABLE PERFORM_RESULT (PERFORM_DT_TM DATE); 

INSERT INTO PERFORM_RESULT 
SELECT TIMESTAMP '2016-05-23 00:00:00' FROM DUAL UNION ALL 
SELECT TIMESTAMP '2016-05-21 12:00:00' FROM DUAL UNION ALL 
SELECT TIMESTAMP '2016-05-19 15:00:00' FROM DUAL; 

查詢1 - 一天的使用級分比較:

SELECT PERFORM_DT_TM, 
     CASE WHEN time >= 6/24 AND time < 14.5/24 THEN 'First Shift' 
      WHEN time >= 14.5/24 AND time < 23/24 THEN 'Second Shift' 
                ELSE 'Third Shift' 
      END AS shift 
FROM (
    SELECT PERFORM_DT_TM, 
     PERFORM_DT_TM - TRUNC(PERFORM_DT_TM) AS time 
    FROM PERFORM_RESULT 
); 

查詢2 - 比較使用間隔

SELECT PERFORM_DT_TM, 
     CASE WHEN time >= INTERVAL '6' HOUR 
      AND time < INTERVAL '14' HOUR + INTERVAL '30' MINUTE 
      THEN 'First Shift' 
      WHEN time >= INTERVAL '14' HOUR + INTERVAL '30' MINUTE 
      AND time < INTERVAL '23' HOUR 
      THEN 'Second Shift' 
      ELSE 'Third Shift' 
      END AS shift 
FROM (
    SELECT PERFORM_DT_TM, 
     NUMTODSINTERVAL(PERFORM_DT_TM - TRUNC(PERFORM_DT_TM), 'DAY') AS time 
    FROM PERFORM_RESULT 
); 

(或者你可以只是所有的時間轉換到分鐘的間隔 - 即INTERVAL '360' MINUTEINTERVAL '870' MINUTEINTERVAL '1380' MINUTE爲界限)

輸出

(兩路輸出相同的結果)

PERFORM_DT_TM  SHIFT  
------------------- ------------ 
2016-05-23 00:00:00 Third Shift 
2016-05-21 12:00:00 First Shift 
2016-05-19 15:00:00 Second Shift