如何将Sysdate转换为GMT?

问题描述 投票:0回答:1

场景很简单,我需要写一个函数,在这个函数中,将提供一个日期,这将是来自数据库的sysdate,该函数的返回值应该是GMT格式的。

最好的建议,请。

sql oracle plsqldeveloper
1个回答
1
投票

为了更好的理解,我们先从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传给函数!让函数使用一个内置的时间戳函数。如果你传递一个日期给函数,函数必须假设它属于哪个时区。

© www.soinside.com 2019 - 2024. All rights reserved.