2016-05-31 8 views
-1

私は23:00から翌日01:00まで毎日イベントを発生させる必要がある状況があります。 Oracleの2つのフィールド間の現在の時刻を確認

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

は、私は再び日付にこれを変換しようとしたが、それはまた、終了日では動作しません。

更新: 私の要件では、現在の時刻が開始日と終了日の間であるかどうかを確認するだけで済みます。毎日このクエリを実行する必要があり、毎日23:00から1:00の間にアクティビティを実行する必要があります。

注:31-05-2015にSysdate between startdate and enddateというクエリを実行すると、真/偽になります。しかし、もし私が夜にこの翌日を走らせると、EndDateはすでに終わっているので、私は偽になるでしょう。だから、私は日付のクエリの間に通常を使用することはできません。

+0

は、なぜあなたは日付フィールドをto_charingとの間で使用していますか?それらをto_charしないでください。 startddateとend_dateの間のsysdateを単純に比較します。エンジンにTEXT値の比較を依頼しています。それはondatesを行うべきではありません... – xQbert

+1

'startddateと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

あなたは、あなたの選択を達成するために、日付やBETWEEN clausuleを使用し、charに日付フィールドを変換する必要はありません。

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日であるので、それが真を返すと言ってみましょう。しかし、明日、私が終了日を実行すると、すでに終了しています。 – smilu

1

私は質問を取得した場合は、日付とは別に時間を扱いたいです。つまり、2016-MAY-31 23:00:00は23:00:00とみなされ、2016-JUN-01 01:00:00はただ01:00:00として扱われ、この2回は範囲?だから私が23:47:43または00:23:11の時間を見ていたら、その範囲内で両方が考慮されるだろうが、22:56:34と01:34:52のような時間は範囲外になるだろうか?

DATEデータ型を使用する場合、範囲は2つの日付にわたっているため、00:23:11のような時刻がYYYY-MM-DD 00: 23:11に設定し、この日付/時刻を2つの日付(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) 
関連する問題