在Oracle中将GMT时间戳(6)转换为系统日期的最佳方法

5q4ezhmt  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(136)

传统审计(SYS.AUD$)和统一审计(AUDSYS.AUD$UNIFIED)的基础表都将其时间戳存储为TIMESTAMP(6)列(无时区),并且始终使用GMT/UTC。**我需要将其转换为 * 系统时间 *(DATE数据类型),以便与大多数其他字典日期(如v$session.logon_time)对齐。有很多关于转换为 * 本地 * 时间的讨论,但我需要 * 系统 * 时间。有人会认为应该有类似于[timestamp] AT LOCAL[timestamp] AT SYSTEM,但事实并非如此。
我从来没有完全清除我的头脑周围的时区模糊,所以我发现它总是有点试错斗争每一次。下面的转换可以工作,但看起来不是很优雅:
audsys.aud$unified.event_timestamp到系统日期:

var_system_date := CAST(event_timestamp AS date)-(CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS date)-SYSDATE)

从系统日期返回到audsys.aud$unified.event_timestamp(除了小数秒,我不需要):

event_timestamp = CAST(var_system_date + (CAST(SYSTIMESTAMP AT TIME ZONE 'UTC' AS date)-SYSDATE) AS timestamp))

我实际上使用日期减法来获得系统时间和GMT之间的天数差异,然后在查询中添加或减去该偏移量以在两者之间进行转换。我可以想到其他一些方法,但它们都一样笨拙或更糟。当然有一个更干净,更优雅的方式,我忽略了?

doinxwow

doinxwow1#

不要随意使用加/减时间值。
SYSDATE返回数据库服务器操作系统的时区中的当前DATE,所以我假设您正在寻找这个。
您可以使用TO_CHAR(SYSTIMESTAMP, 'tzr')查询数据库服务器操作系统的时区
试试这个:

CAST(
   FROM_TZ(event_timestamp , 'UTC') AT TIME ZONE TO_CHAR(SYSTIMESTAMP, 'tzr')
   AS DATE)

相关问题