gpt4 book ai didi

SQL UTC 日期而不是 SYSDATE

转载 作者:行者123 更新时间:2023-12-01 10:35:22 26 4
gpt4 key购买 nike

正在处理以下查询。

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 当前是哪一天。

最佳答案

正如 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。

由于不涉及日期变化,因此可以使用 session 时间而不是服务器时间来演示效果:

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

我的 session 时间是 2016-04-09,但它仍然发现 UTC 日期为 2016-04-08。

(需要说明的是,我建议您改用current_timestampcurrent_date;我使用的是那些而不是systimestampsysdate 纯粹作为演示)。

关于SQL UTC 日期而不是 SYSDATE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36503219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com