1

次のような select ステートメントにオラクルの時間間隔があります。

SELECT ...
    CASE WHEN date1 - date2 > 0 
    THEN 'No'
    ELSE 'YES'
END 

これは無効なデータ型で失敗します。だから私はこれを試しましたが、それでも失敗します。

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) 
    THEN 'No'
    ELSE 'YES'
END 

間隔タイプを比較する方法はありますか?

4

5 に答える 5

2

あなたの質問は INTERVAL データ型に言及していますが、それがどこで起こっているのか、あなたの例からは明らかではありません。日付と間隔の算術演算は非常に単純です。

SQL> select d1
  2         , d2
  3         , case when d2  > d1 + to_dsinterval ('10 0:0:0')
  4                 then 'no'
  5                 else 'yes' end
  6  from t34
  7  /

D1        D2        CAS
--------- --------- ---
02-JUL-10 25-JUN-10 yes
02-JUL-10 24-AUG-10 no
02-JUL-10 26-MAY-10 yes
02-JUL-10 25-JUL-10 no
02-JUL-10 15-APR-09 yes
02-JUL-10 13-JUL-10 no

6 rows selected.

SQL>

両方の列が INTERVAL データ型の場合、算術演算は明らかに機能します。

SQL> select intvl1
  2         , intvl2
  3         , case when intvl2  > intvl1
  4                 then 'no'
  5                 else 'yes' end
  6  from t34
  7  /

INTVL1               INTVL2               CAS
-------------------- -------------------- ---
+10 00:00:00.000000  +07 00:00:00.000000  yes
+10 00:00:00.000000  -53 00:00:00.000000  yes
+10 00:00:00.000000  +37 00:00:00.000000  no
+10 00:00:00.000000  -23 00:00:00.000000  yes
+10 00:00:00.000000  +78 00:00:00.000000  no
+10 00:00:00.000000  -11 00:00:00.000000  yes

6 rows selected.

SQL>

2 つの日付と間隔の差を比較するのは簡単です...

SQL> select d1
  2         , d2
  3         , intvl1
  4         , case when  numtodsinterval(d1-d2, 'DAY') > intvl1
  5                 then 'no'
  6                 else 'yes' end
  7  from t34
  8  /

D1        D2        INTVL1               CAS
--------- --------- -------------------- ---
02-JUL-10 25-JUN-10 +10 00:00:00.000000  yes
02-JUL-10 24-AUG-10 +10 00:00:00.000000  yes
02-JUL-10 26-MAY-10 +10 00:00:00.000000  no
02-JUL-10 25-JUL-10 +10 00:00:00.000000  yes
02-JUL-10 15-APR-10 +10 00:00:00.000000  no
02-JUL-10 13-JUL-10 +10 00:00:00.000000  yes

6 rows selected.

SQL>

つまり、エラーを取得するために何をしているのかを理解するのは困難です。そのため、質問を編集して詳細を提供する必要があります。テーブルについて説明します。いくつかのサンプル データを提供します。また、エラー メッセージ全体をお知らせください。

于 2010-07-02T14:57:28.723 に答える
1

INTERVAL DAY TO SECOND 型で算術演算を実行している場合は、別の INTERVAL DAY TO SECOND 列と比較する必要があります。

SQL> SELECT
  2         CASE when (NUMTODSINTERVAL(1, 'DAY') - NUMTODSINTERVAL (1, 'HOUR')) 
                        > (numtodsinterval(0, 'day'))
  3              then 1
  4              else 0
  5         end as expression
  6*  from dual
med_audit@AGDEV:SQL> /

EXPRESSION
----------
         1
于 2010-07-02T15:15:34.993 に答える
1

推測では、あなたの列はTIMESTAMPs. 2 つの を減算するDATEと、結果はNUMBER; 2 つの を減算するTIMESTAMPと、結果は になりINTERVALます。2 番目のクエリを修正するには、次のように置き換えSYSDATEますSYSTIMESTAMP

SELECT ...
    CASE WHEN date1 - date2 > (systimestamp - systimestamp) 
    THEN 'No'
    ELSE 'YES'
END 
...

TO_DSINTERVALただし、既に提案されているように、 を使用した方がよいでしょう。

于 2010-07-02T16:16:49.823 に答える
1

10g データベースで次のコマンドを実行すると、すべて正常に動作します。

SQL> create table temptbl (d1 date, d2 date);

Table created

SQL> insert into temptbl values (sysdate, sysdate-1/12);

1 row inserted

SQL> insert into temptbl values (sysdate, sysdate+1/12);

1 row inserted

SQL> SELECT CASE WHEN d1 - d2 > 0 THEN 'No' ELSE 'YES' END result FROM temptbl;

RESULT
------
No
YES

この声明で他に何をしていますか?

于 2010-07-02T14:57:29.330 に答える
-1

追加day to secondすると、2番目の値が間隔に変わり、機能することがわかりました。アイデアをありがとう。

SELECT ...
    CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
    THEN 'No'
    ELSE 'YES'
END 
于 2010-07-02T16:29:32.143 に答える