مقارنة نوع بيانات الفاصل الزمني Oracle
-
02-10-2019 - |
سؤال
لدي فاصل زمني Oracle في بيان محدد مثل هذا:
SELECT ...
CASE WHEN date1 - date2 > 0
THEN 'No'
ELSE 'YES'
END
هذا فشل مع نوع البيانات غير صالح. لذلك جربت هذا ، وما زال يفشل.
SELECT ...
CASE WHEN date1 - date2 > (sysdate - sysdate)
THEN 'No'
ELSE 'YES'
END
هل هناك أي طريقة لمقارنة أنواع الفاصل الزمني؟
المحلول 5
اكتشفت عندما أضفت day to second
تحولت القيمة الثانية إلى فاصل وعملت. شكرا للجميع على الأفكار.
SELECT ...
CASE WHEN date1 - date2 > (sysdate - sysdate) day to second
THEN 'No'
ELSE 'YES'
END
نصائح أخرى
يذكر سؤالك نوع بيانات الفاصل الزمني ، على الرغم من أنه غير واضح من الأمثلة الخاصة بك أين أو إذا كان ذلك يحدث. الحساب مع التواريخ والفترات بسيطة للغاية ؛
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>
عندما يكون كلا العمودين من نوع البيانات الفاصلة ، يعمل الحساب بوضوح:
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>
مقارنة الفرق بين تواريخين وفاصل زمني هو cinch ...
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>
باختصار ، من الصعب فهم ما تفعله للحصول على خطأ. لذلك تحتاج إلى تعديل سؤالك وتقديم المزيد من التفاصيل. صف الجدول. توفير بعض بيانات العينة. أيضا ، أعطنا رسالة الخطأ بأكملها.
إذا قمت بتنفيذ ما يلي على قاعدة بيانات 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
ماذا تفعل في هذا البيان؟
إذا كنت تؤدي الحساب في يوم الفاصل إلى الأنواع الثانية ، فأنت بحاجة إلى مقارنته مع يوم فاصل آخر إلى العمود الثاني.
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
بتخمين ، أقول أن أعماتك TIMESTAMP
س. عندما تطرح اثنين DATE
S ، والنتيجة هي أ NUMBER
; ؛ عندما تطرح اثنين TIMESTAMP
S ، والنتيجة هي INTERVAL
. لإصلاح استعلامك الثاني ، استبدل SYSDATE
مع SYSTIMESTAMP
:
SELECT ...
CASE WHEN date1 - date2 > (systimestamp - systimestamp)
THEN 'No'
ELSE 'YES'
END
...
ومع ذلك ، من الأفضل استخدامك TO_DSINTERVAL
, ، كما تم اقتراح بالفعل.