Oracle 11g 中两个日期的差异未按预期出现

Difference in two dates not coming as expected in Oracle 11g

我通过 OSB 代理服务获取了一些数据,必须使用 Xquery 对其进行转换。早些时候,转换是在数据库上完成的,但现在是在代理本身上完成的。所以我得到了使用过的 SQL 查询,并且必须生成与这些查询相对应的 Xquery 表达式。

这里是 SQL 查询,它应该找出两个日期之间的差异。

SELECT ROUND((CAST(DATEATTRIBUTE2 AS DATE) -
              CAST(DATEATTRIBUTE1 AS DATE) ) * 86400 ) AS result
FROM SONY_TEST_TABLE;

DATEATTRIBUTE1 和 DATEATTRIBUTE2 都是 TIMESTAMP 类型。
根据我的理解,此查询首先将 TIMESTAMP 转换为 DATE,以便剥离时间部分,然后减去日期。天数差异乘以 86400 得到以秒为单位的持续时间。

但是,当我将 DATEATTRIBUTE2 设为 23-02-17 01:17:19.399000000 AM 并将 DATEATTRIBUTE1 设为 23-02-17 01:17:18.755000000 AM 时,理想情况下结果应为 0 作为日期是相同的,我忽略了时差,但令人惊讶的是结果为 1。检查后我发现 ( CAST(DATEATTRIBUTE2 AS DATE) - CAST(DATEATTRIBUTE1 AS DATE) ) 部分显然不给出整数值而是小数。

这是如何工作的? o_O

感谢任何帮助。干杯!

EDIT :多亏了所有的答案,问题解决了!即使在投射到 DATE 之后它仍然有时间,所以也会计算时差。现在如何在 XQuery 中实现它?看到这个 other question.

你应该试试这个来找出每天的差异

SELECT  (trunc(DATEATTRIBUTE2) -
              trunc(DATEATTRIBUTE1) )  AS result
FROM SONY_TEST_TABLE;

备选方案 2

您可以像下面这样使用提取物:

SELECT ROUND (
            EXTRACT (MINUTE FROM INTERVAL_DIFFERENCE) / (24 * 60)
          + EXTRACT (HOUR FROM INTERVAL_DIFFERENCE) / 24
          + EXTRACT (DAY FROM INTERVAL_DIFFERENCE))
  FROM (SELECT (  TO_TIMESTAMP ('23-02-17 01:17:19', 'dd-mm-yy hh24:mi:ss')
                - TO_TIMESTAMP ('23-02-17 01:17:17', 'dd-mm-yy hh24:mi:ss'))
                  INTERVAL_DIFFERENCE
          FROM DUAL)

Oracle DATE 数据类型实际上是一个日期时间。因此,将某物作为日期并不会删除时间元素。为此,我们需要截断值:

( trunc(DATEATTRIBUTE2) - trunc(DATEATTRIBUTE1) )