使用时间戳将日期差异转换为日期

时间:2021-03-22 10:28:33

标签: oracle plsql

如何将带时间戳的 2 个日期的差异再次转换为带时间戳的日期,Oracle 给出数字,但我想比较时间戳。

select emp_date>to_date(sysdate,'yyyy-MM-dd HH24:MI:SS')-todate('2021-03-22 10:20:12') from emp;

上面的查询给出错误:预期日期但得到 NUMBER。

提前致谢

2 个答案:

答案 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;

但是,这会失败,因为您无法将 DATEINTERVAL DAY TO SECOND 进行比较,并且 SQL 没有布尔数据类型,因此 > 没有意义。

为了解决这个问题,您可以使用 CASE 表达式,但数据类型的差异是一个阻碍,因为您无法将日期与间隔进行比较。

<块引用>

但我想比较时间戳。

您没有 TIMESTAMP 数据类型,您有一个数字(表示以天为单位的间隔)或 INTERVAL 数据类型。如果您想将其转换回 DATETIMESTAMP,那么您需要将您的间隔添加到一个纪元值。