处理以下查询。
SELECT MIN(departure_date), ch_invoice.invoice_id
FROM ch_invoice
INNER JOIN ch_trip
ON ch_invoice.invoice_id = ch_trip.invoice_id
WHERE departure_date < SYSDATE
AND service_rendered = 0
AND paid = 1
Group By ch_invoice.invoice_id
由于它所点击的数据库可能位于日期尚未更改的位置,并且我们使用UTC作为日期的标准,是否可以将SYSDATE替换为UTCDATE?我只需要知道UTC目前的日期。
答案 0 :(得分:4)
正如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-04-09,但仍然发现UTC日期为2016-04-08。
(要明确的是,我不建议您切换到使用current_timestamp
或current_date
;我正在使用这些而不是systimestamp
和{{ 1}}纯粹作为演示)。
答案 1 :(得分:2)
SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL;