正如AntDC建议的那样,您可以使用the SYS_EXTRACT_UTC()
function。这将“时区与日期时间”从任何时区转换为UTC。
SYSDATE没有时区。如果你通过它,那么它会隐式转换到系统时区,所以它可以工作,但是可以使用SYSTIMESTAMP,因为它已经是区域感知的。
您在评论中说过要使用日期,但所有Oracle日期都有时间组件;你可以用(这是有道理的,你做的比较)与TRUNC()
设置为午夜时得到的结果为日期类型:
select systimestamp,
sys_extract_utc(systimestamp) as utctime,
trunc(sys_extract_utc(systimestamp)) as utcdate
from dual;
SYSTIMESTAMP UTCTIME UTCDATE
-------------------------------- ------------------------- -------------------
2016-04-08 17:18:27.352 +01:00 2016-04-08 16:18:27.352 2016-04-08 00:00:00
这是在英国的服务器上运行,所以当地时间是BST。
由于不涉及每日变化,其效果可以使用会话的时间,而不是服务器的时间证明:
alter session set time_zone = '+12:00';
select current_timestamp,
sys_extract_utc(current_timestamp) as utctime,
trunc(sys_extract_utc(current_timestamp)) as utcdate
from dual;
CURRENT_TIMESTAMP UTCTIME UTCDATE
-------------------------------- ------------------------- -------------------
2016-04-09 04:23:17.910 +12:00 2016-04-08 16:23:17.910 2016-04-08 00:00:00
我的会议时间是2016年4月9日,但仍发现UTC日期为2016-04-08。
(要清楚,我不建议切换到使用current_timestamp
或current_date
;我使用的systimestamp
和sysdate
纯粹作为演示者,而不是)。
您的编辑预期了我的问题并回答了它。谢谢!这很清楚。我相信这实现了我正在寻找的东西。 – CheeseFry