2016-04-08 25 views
2

处理以下查询。SQL UTC日期而不是SYSDATE

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作为我们的日期的标准,是有可能的东西,如UTCDATE代替SYSDATE ?我只需要知道UTC当前的日期。

回答

3

正如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_timestampcurrent_date;我使用的systimestampsysdate纯粹作为演示者,而不是)。

+0

您的编辑预期了我的问题并回答了它。谢谢!这很清楚。我相信这实现了我正在寻找的东西。 – CheeseFry

1
SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL; 
+0

谢谢你的片段。你能解释它在做什么吗? – CheeseFry

+0

http://psoug.org/definition/SYS_EXTRACT_UTC.htm SYS_EXTRACT_UTC是返回给定日期 – AntDC

+0

UTC日期函数你不是应该转换系统时间,而不是表时间,即SYS_EXTRACT_UTC(SYSTIMESTAMP) ?如果您在'departure_date'上调用它,并且这是一个DATE类型,它会首先隐式转换为系统时区,这可能会导致奇怪的结果,因为它听起来像存储值应该已经是UTC。 –