我有Oracle 12c数据库表,其中一个列utc_timestamp的类型为
UTC_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE
它以UTC格式存储时间戳,而current_timestamp
和systimestamp
都在不同时区显示时间戳。
如何在几分钟内获得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。请帮我找一下我做错了什么。
答案 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小时。