sql - 如何将 Sysdate 转换为 GMT?
问题描述
所以场景很简单,我需要编写一个函数,其中将提供一个日期,该日期将是数据库中的 sysdate,并且函数的返回值应该是 GMT 格式。此功能可根据业务场景跨不同数据库中的不同时区使用。我们需要处理夏令时概念和其他事情,它应该返回 GMT Date。
最好的建议,请。
解决方案
为了更好地理解,让我们从 Oracle 时区支持开始。时区信息有三种不同的来源:
- 操作系统的时区(在数据库启动时设置)
- 数据库时区(在创建数据库时设置)
- 会话的“本地”时区(可以用 更改
ALTER SESSION
)
Oracle 日期时间数据类型:
DATE
:包括日期、小时、分钟和整秒,但没有时区信息;TIMESTAMP
: 也可以包含小数秒,但不包含时区信息;TIMESTAMP WITH TIME ZONE
: 包括时区信息,可以是与 UTC 的偏移量('-4:00')或指定的时区('Europe/Paris')。偏移量不会针对夏令时进行调整,命名时区会。TIMESTAMP WITH LOCAL TIME ZONE
:存储时转换为数据库时区,选中时转换为会话时区。
现在对于返回“现在”的内置函数:
SYSDATE
:aDATE
(以秒为单位)基于操作系统的时区;SYSTIMESTAMP
:aTIMESTAMP WITH TIME ZONE
基于操作系统的时区;CURRENT_DATE
:aDATE
(以时间到秒)基于会话时区;CURRENT_TIMESTAMP
: aTIMESTAMP WITH TIME ZONE
基于会话时区;LOCALTIMESTAMP
: aTIMESTAMP
基于会话时区;
最后,有两种方法可以从其他时区到达 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;
PS 不要将 SYSDATE 传递给函数!让函数使用内置时间戳函数之一。如果将日期传递给函数,则函数必须假定它属于哪个时区。
推荐阅读
- python-3.x - Django 项目:自定义管理模板未加载到 AWS ElasticBean 服务器上
- css - React App 中不显示背景图像
- mysql - 冻结mysql表
- javascript - 未捕获的错误:OpenTok 注释小部件需要 OpenTok 解决方案
- php - 从 Woocommerce 中的自定义属性创建 URL
- asp.net-core - 在剃刀视图中添加/删除功能
- c++ - 从 elf 文件中获取 .eh_frame 部分的内容
- android - Kotlin 1.4.20 - 构建速度较慢
- node.js - 使用 Node.is 从 GCP 存储获取文件
- css - 移除 Material UI 的 TextField 中的上下箭头