在Oracle中计算两个时间戳之间的差值(以天为单位),包括时间戳之间的时间差。

5

我有一个Oracle数据库中有两个带有时间戳的字段的表格。我需要计算这两列之间的差异,包括时间戳值,以天为单位。

Ex :- I have both column values as following than 
Column1 value = 07-DEC-16 11.05.24.500000000 PM 
Column2 value = 08-DEC-16 03.12.06.874000000 AM

需要显示天数计算为1。目前,在搜索并阅读了许多stackoverflow上的问题后,我知道了如何使用以下查询来计算这两个列之间的差异。

Select Extract( Day From Diff ) Days
From (Select B1.Column2 - B1.Column1 As Diff
From Table1 B1);

这个查询结果将计算的天数显示为0而不是1。

我不知道该怎么办,请指导一下。 是否需要将其转换为其他格式?还是有其他需要操作的地方?


1
实际上它是0.6713天的差异,那么你使用的逻辑是什么,认为这是1天的差异?您只是比较 YYYY-MM-DD 部分,并且12月7日和12月8日之间有1天的差异吗?还是您做了一些四舍五入?如果是这样,那么1.001天的差异会怎样(会四舍五入为1天还是2天的差异)? - MT0
从实际日期差异"+00 04:06:42.374000"开始。从这个结果中,您正在提取正确的0天值。您的要求是什么,即“天数计算应显示为1”?时间戳之间的差异仅超过4小时。这怎么会变成1天呢?如果4小时的差异在同一天内,会怎样呢? - unleashed
需求并没有说它应该精确计算一天,而是说应该计算包括时间差在内的天数差异。 - emphywork
1个回答

9

如果您只需要计算从2016-12-072016-12-08的日期差异(忽略时间部分),则可以执行以下操作:

SELECT TRUNC( column2 ) - TRUNC( column1 ) AS days
FROM   table1
如果您希望将差异四舍五入到最近的一天(忽略小数秒),那么可以执行以下操作:
SELECT CEIL( CAST( column2 AS DATE ) - CAST( column1 AS date ) ) AS days
FROM   table1

如果你想包含小数秒并向上舍入到最近的一天,则:

SELECT CEIL(
         TRUNC( column2, 'MI' )
         - TRUNC( column1, 'MI' )
         + EXTRACT( SECOND FROM column2 ) / (24*60*60)
         - EXTRACT( SECOND FROM column1 ) / (24*60*60)
       ) AS days
FROM   table1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,