[英]SQL UTC date instead of 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目前的哪一天。
正如AntDC建议的那样,您可以使用SYS_EXTRACT_UTC()
函数 。 这会将“日期时间与时区”从其所在的时区转换为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
和sysdate
纯粹作为演示)。
SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.