类型为“timestamp(6)with timezone”的列和“当前时间”以分钟为单位的差异

时间:2017-08-23 22:07:11

标签: oracle12c

我有Oracle 12c数据库表,其中一个列utc_timestamp的类型为

UTC_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE

它以UTC格式存储时间戳,而current_timestampsystimestamp都在不同时区显示时间戳。

如何在几分钟内获得MAX(utc_timestamp)current_timestamp的时差,忽略由于不同时区造成的时差。

例如:

select current_timestamp from dual;
Gives=> 23-AUG-17 04.43.16.253931000 PM AMERICA/CHICAGO

select systimestamp from dual;
Gives=> 23-AUG-17 05.43.16.253925000 PM -04:00

select max(UTC_TIMESTAMP) from table_name;
Gives=> 23-AUG-17 09.40.02.000000000 PM +00:00

对于上述情况,当我运行SQL来检查MAX(utc_timestamp)current_timestamp之间的时差时,我应该得到数字3。

我想我需要这样的东西:

select (extract(minute from current_timestamp) - extract(minute from max(UTC_TIMESTAMP)) * 1440) AS minutesBetween from table_name;

但不同的时区搞砸了,我得到像-4317这样的负数。这可能是正确的,因为current_timestamp将高于CST中的max(utc_timestamp)。所以我试过了:

select (extract(minute from CAST(current_timestamp as TIMESTAMP(6) WITH TIME ZONE)) - extract(minute from max(UTC_TIMESTAMP)) * 1440) AS minutesBetween from table_name;

此SQL运行时没有错误,但产生一个大的负数,如-83461。请帮我找一下我做错了什么。

1 个答案:

答案 0 :(得分:1)

你真的有两个问题。

一种是将CURRENT_TIMESTAMP转换为UTC。这是微不足道的:

select CURRENT_TIMESTAMP AT TIME ZONE 'UTC' from dual   [.....]

(使用AT TIME ZONE条款https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm#i1007699

另一个是两个时间戳之间的差异是间隔,而不是数字。

select current_timestamp at time zone 'UTC'
       - to_timestamp_tz('24-AUG-17 04.00.00.000 AM UTC', 'dd-MON-yy hh.mi.ss.ff AM TZR')
from dual;

产生类似

的东西
+00 00:02:39.366000

表示+(正差)00天,00小时,02分钟,39.366秒。

如果您只想要分钟(总是向下舍入),您可以将整个表达式包装在extract( minute from < ...... > )中。请注意,即使差异为5小时2分钟,答案仍然是2分钟。最好将结果保留为区间数据类型,除非您100%确定(或更多)结果始终小于1小时。