场景很简单,我需要写一个函数,在这个函数中,将提供一个日期,这将是来自数据库的sysdate,该函数的返回值应该是GMT格式的。
最好的建议,请。
为了更好的理解,我们先从Oracle时区支持说起。时区信息有三个不同的来源。
ALTER SESSION
)Oracle数据时间数据类型。
DATE
数据类型:包括日期、小时、分钟和整数秒,但不包括时区信息。TIMESTAMP
包括日期、小时、分钟和整数秒,但没有时区信息; :也可以包括小数秒,但没有时区信息。TIMESTAMP WITH TIME ZONE
包括时区信息,可以是UTC的偏移量('-4:00')或指定时区('EuropeParis')。偏移量不会根据夏令时进行调整,而指定时区会。TIMESTAMP WITH LOCAL TIME ZONE
储存时,该值会被转换为数据库时区,选择时,会被转换为会话时区。现在是返回 "right now "的内置函数。
SYSDATE
: a DATE
基于操作系统的时区(时间精确到秒)。SYSTIMESTAMP
: a TIMESTAMP WITH TIME ZONE
基于操作系统的时区。CURRENT_DATE
: a DATE
基于会话时区的时间(时间精确到秒)。CURRENT_TIMESTAMP
: a TIMESTAMP WITH TIME ZONE
以会话时区为基础。LOCALTIMESTAMP
: a TIMESTAMP
基于会话时区。最后,有两种方法可以从其他时区到GMT。
AT TIME ZONE 'GMT'
将返回一个 TIMESTAMP WITH TIME ZONE
SYS_EXTRACT_UTC
将返回一个 TIMESTAMP
这两种方法都需要某种 TIMESTAMP
作为输入,然后需要将其输出为 CAST
作为 DATE
.
所以以下任何一项都会给你一个 DATE
在GMT时区的值。
select
cast(systimestamp at time zone 'gmt' as date),
cast(current_timestamp at time zone 'gmt' as date),
cast(localtimestamp at time zone 'gmt' as date),
cast(sys_extract_utc(systimestamp) as date),
cast(sys_extract_utc(current_timestamp) as date),
cast(sys_extract_utc(localtimestamp) as date)
from dual;
P.S. 不要把SYSDATE传给函数!让函数使用一个内置的时间戳函数。如果你传递一个日期给函数,函数必须假设它属于哪个时区。