首页 > 解决方案 > 如何将 Sysdate 转换为 GMT?

问题描述

所以场景很简单,我需要编写一个函数,其中将提供一个日期,该日期将是数据库中的 sysdate,并且函数的返回值应该是 GMT 格式。此功能可根据业务场景跨不同数据库中的不同时区使用。我们需要处理夏令时概念和其他事情,它应该返回 GMT Date。

最好的建议,请。

标签: sqloracletimestamp-with-timezone

解决方案


为了更好地理解,让我们从 Oracle 时区支持开始。时区信息有三种不同的来源:

  • 操作系统的时区(在数据库启动时设置)
  • 数据库时区(在创建数据库时设置)
  • 会话的“本地”时区(可以用 更改ALTER SESSION

Oracle 日期时间数据类型:

  • DATE:包括日期、小时、分钟和整秒,但没有时区信息;
  • TIMESTAMP: 也可以包含小数秒,但不包含时区信息;
  • TIMESTAMP WITH TIME ZONE: 包括时区信息,可以是与 UTC 的偏移量('-4:00')或指定的时区('Europe/Paris')。偏移量不会针对夏令时进行调整,命名时区会。
  • TIMESTAMP WITH LOCAL TIME ZONE:存储时转换为数据库时区,选中时转换为会话时区。

现在对于返回“现在”的内置函数:

  • SYSDATE:a DATE(以秒为单位)基于操作系统的时区;
  • SYSTIMESTAMP:aTIMESTAMP WITH TIME ZONE基于操作系统的时区;
  • CURRENT_DATE:a DATE(以时间到秒)基于会话时区;
  • CURRENT_TIMESTAMP: aTIMESTAMP WITH TIME ZONE基于会话时区;
  • LOCALTIMESTAMP: aTIMESTAMP基于会话时区;

最后,有两种方法可以从其他时区到达 GMT:

  • AT TIME ZONE 'GMT'将返回一个TIMESTAMP WITH TIME ZONE
  • SYS_EXTRACT_UTC将返回一个TIMESTAMP

这两种方法都需要某种TIMESTAMP作为输入,然后输出需要CAST作为DATE.

因此,以下任何一项都会为您提供DATEGMT 时区的值:

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;

PS 不要将 SYSDATE 传递给函数!让函数使用内置时间戳函数之一。如果将日期传递给函数,则函数必须假定它属于哪个时区。


推荐阅读