繁体   English   中英

SQL UTC日期而不是SYSDATE

[英]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_timestampcurrent_date ;我使用那些而不是systimestampsysdate纯粹作为演示)。

SELECT SYS_EXTRACT_UTC(departure_date)UTC_SYS, SYSTIMESTAMP FROM DUAL; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM