比较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>
比较两个日期和间隔之间的差异是一个束缚...
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
s。当您减去两个 DATE
s,结果是 NUMBER
;当您减去两个 TIMESTAMP
s,结果是 INTERVAL
. 。要修复第二个查询,请更换 SYSDATE
和 SYSTIMESTAMP
:
SELECT ...
CASE WHEN date1 - date2 > (systimestamp - systimestamp)
THEN 'No'
ELSE 'YES'
END
...
但是,您最好使用 TO_DSINTERVAL
, ,正如已经建议的那样。
不隶属于 StackOverflow