SQL UTC日期而不是SYSDATE

时间:2016-04-08 15:13:07

标签: sql oracle

处理以下查询。

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目前的日期。

2 个答案:

答案 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_timestampcurrent_date;我正在使用这些而不是systimestamp和{{ 1}}纯粹作为演示)。

答案 1 :(得分:2)

SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL;