2016-05-31 143 views
-1

我有一種情況,我需要在23:00至次日01:00之間每天舉辦一個活動。 我的表有最新的數據,這將是這樣的:在Oracle中的兩個字段之間查找當前時間

Start date   | EndDate 
31-05-2016 23:00:00 | 01-06-2016 01:00:00 

已經數據庫這樣設計和應用現場。現在,我嘗試使用BETWEEN聲明獲取數據,但是,由於ENDDate是第二天早上,我無需工作。

有人可以告訴如何正確提取這些數據。

ORACLE查詢

SELECT COUNT(*) INTO P_OUTPUT FROM MAINTENANCE_LOG WHERE  
NVL(RECCURING_TYPE,'O')='D' AND ACTIVE_STATUS='Y' AND 
TO_CHAR(SYSDATE,'HH24MISS') BETWEEN TO_CHAR(START_DATE,'HH24MISS') AND TO_CHAR(END_DATE,'HH24MISS'); 

我試圖再次將這個至今,但它也不會與結束日期的工作。

更新: 在我的要求中,我只需要檢查當前時間是在startdate還是enddate時間之間。我需要每天運行這個查詢,它應該在每天的23:00到1:00之間進行一次活動。

注意:如果我在2015年5月31日運行Sysdate between startdate and enddate的查詢,我將得到true/false。但是,如果我在晚上第二天運行,我只會因爲EndDate已經結束而失敗。所以,我不能使用日期查詢之間的正常。

+0

你爲什麼to_charing日期字段之間用?不要to_char他們。簡單地比較start_date和end_date之間的sysdate ...您要求引擎比較TEXT值。不應該在ondates完成... – xQbert

+1

關於start_date和end_date之間的sysdate是什麼? –

+0

爲什麼我在做To_CHAR即使我的數據有日期我只需要檢查當前時間是23:00到01:00之間。它應該給我一個基於它的計數(*)。 – smilu

回答

1
SELECT COUNT(*) 
INTO P_OUTPUT 
FROM MAINTENANCE_LOG 
WHERE RECCURING_TYPE = 'D' 
AND ACTIVE_STATUS = 'Y' 
AND (SYSDATE - TRUNC(SYSDATE) BETWEEN START_DATE - TRUNC(START_DATE) 
             AND END_DATE - TRUNC(START_DATE) 
     OR 
     SYSDATE - TRUNC(SYSDATE) BETWEEN START_DATE - TRUNC(END_DATE) 
             AND END_DATE - TRUNC(END_DATE) 
     ) 
0

你不需要轉換日期字段爲char,只使用日期和BETWEEN clausule來實現自己的選擇:

SELECT COUNT(*) INTO P_OUTPUT 
FROM MAINTENANCE_LOG 
WHERE  
    NVL(RECCURING_TYPE,'O')='D' AND 
    ACTIVE_STATUS='Y' AND 
    SYSDATE BETWEEN START_DATE AND END_DATE; 

不管怎樣,在你的問題......你可以添加YYYYMMDD ......但是請,如果您使用日期字段,請不要這樣做。

TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') BETWEEN 
TO_CHAR(START_DATE,'YYYYMMDDHH24MISS') AND 
TO_CHAR(END_DATE, 'YYYYMMDDHH24MISS') 
+0

我已經完成了這些。但是,我的要求是隻提取時間並將當前時間與開始和結束時間進行比較。今天讓我們說,當我運行查詢時,它會在5月31日之後返回true。但明天當我運行結束日期已經結束。 – smilu

1

如果我有問題,你想從日期分開處理的時間。也就是說,2016-MAY-31 23:00:00應該只被視爲23:00:00,而2016-JUN-01 01:00:00應該只被視爲01:00:00,並將這兩次視爲範圍?所以如果我在23:47:43或00:23:11的時候看,兩者都會被認爲在範圍內,但是像22:56:34和01:34:52那樣的時間會超出範圍?

要使用DATE數據類型,您的範圍跨越兩個日期,因此您需要在時間輸入值上放置日期,以便像00:23:11這樣的時間將被視爲YYYY-MM-DD 00: 23:11並且使這個日期/時間落在你的兩個日期/時間之間(START_DATE和END_DATE)

在你的例子中,2016-JUN-01 00:23:11可以工作,但2016-MAY-31 00: 23:11不會。 23:47:23類似,2016-MAY-31 23:47:23可以工作,但2016-JUN-01 23:47:23不會。

基本上,該規則可能如下: 如果你要測試的時間有一個小時< 12(中午),從END_DATE追加的日期,否則(小時> = 12)從START_DATE追加日期並將結果與​​START_DATE和END_DATE中的日期/時間進行比較。

也許這樣的事情(我模擬的開始/結束日期表查詢這裏):

WITH test_data AS 
(SELECT '00:23:11' as time_char 
    FROM dual 
UNION ALL 
SELECT '23:47:23' as time_char 
    FROM dual 
UNION ALL 
SELECT '22:56:34' as time_char 
FROM dual 
UNION ALL 
SELECT '01:34:52' as time_char 
    FROM dual 
UNION ALL 
SELECT '12:34:52' as time_char 
    FROM dual 
UNION ALL 
SELECT '23:00:00' as time_char 
    FROM dual 
UNION ALL 
SELECT '01:00:00' as time_char 
    FROM dual 
UNION ALL 
SELECT '22:59:59' as time_char 
    FROM dual 
UNION ALL 
SELECT '01:0:01' as time_char 
    FROM dual 
) 
SELECT test_data.time_char, start_end_table.* 
FROM (SELECT TO_DATE('2016-MAY-31 23:00:00', 'YYYY-MON-DD HH24:MI:SS') as start_date 
      , TO_DATE('2016-JUN-01 01:00:00', 'YYYY-MON-DD HH24:MI:SS') as end_date 
     FROM dual 
    ) start_end_table 
    FULL OUTER JOIN 
    test_data 
    ON 
    CASE WHEN TO_NUMBER(SUBSTR(test_data.time_char, 1, 2)) < 12 
      THEN TO_DATE(TO_CHAR(start_end_table.end_date, 'YYYYMMDD')||test_data.time_char, 'YYYYMMDDHH24:MI:SS') 
      ELSE TO_DATE(TO_CHAR(start_end_table.start_date, 'YYYYMMDD')||test_data.time_char, 'YYYYMMDDHH24:MI:SS') 
     END 
     BETWEEN start_end_table.start_date AND start_end_table.end_date 

TIME_CHAR START_DATE    END_DATE 
00:23:11 2016-MAY-31 23:00:00 2016-JUN-01 01:00:00 
23:47:23 2016-MAY-31 23:00:00 2016-JUN-01 01:00:00 
23:00:00 2016-MAY-31 23:00:00 2016-JUN-01 01:00:00 
01:00:00 2016-MAY-31 23:00:00 2016-JUN-01 01:00:00 
01:34:52   (null)     (null) 
01:0:01   (null)     (null) 
22:59:59   (null)     (null) 
22:56:34   (null)     (null) 
12:34:52   (null)     (null) 
相關問題