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) )
我通过 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) )