如何将带时间戳的 2 个日期的差异再次转换为带时间戳的日期,Oracle 给出数字,但我想比较时间戳。
select emp_date>to_date(sysdate,'yyyy-MM-dd HH24:MI:SS')-todate('2021-03-22 10:20:12') from emp;
上面的查询给出错误:预期日期但得到 NUMBER。
提前致谢
答案 0 :(得分:0)
你说的话毫无意义。两个 DATE
数据类型值的差异是它们之间的天数。例如
SQL> select sysdate - to_date('21.03.2021 13:12', 'dd.mm.yyyy hh24:mi') diff from dual;
DIFF
----------
,943217593
SQL>
您可以将其转换为更漂亮的格式(天、小时、分钟、秒),但它仍然是数字,而不是日期。
因此,您不能将 EMP_DATE
(这是一个 DATE
数据类型列,不是吗?)与数字进行比较,因为它没有意义。
2021 年 3 月 22 日是大于还是小于 0.94?两者都不是。
答案 1 :(得分:0)
[TL;DR] 您不能,因为您的数据类型不匹配,并且将日期/时间值与间隔进行比较是没有意义的。
如果你这样做:
date_value1 - date_value2
您将获得一个 NUMBER
数据类型,表示两个日期值之间的(小数)天数。
您可以使用以下方法显式转换减法运算以获取 INTERVAL DAY TO SECOND
数据类型:
(date_value1 - date_value2) DAY TO SECOND
因此,对于您的代码:
SELECT emp_date > ( sysdate - TO_DATE( '2021-03-22 10:20:12', 'YYYY-MM-DD HH24:MI:SS' ) ) DAY TO SECOND
FROM emp;
但是,这会失败,因为您无法将 DATE
与 INTERVAL DAY TO SECOND
进行比较,并且 SQL 没有布尔数据类型,因此 >
没有意义。
为了解决这个问题,您可以使用 CASE
表达式,但数据类型的差异是一个阻碍,因为您无法将日期与间隔进行比较。
但我想比较时间戳。
您没有 TIMESTAMP
数据类型,您有一个数字(表示以天为单位的间隔)或 INTERVAL
数据类型。如果您想将其转换回 DATE
或 TIMESTAMP
,那么您需要将您的间隔添加到一个纪元值。