传统审计(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之间的天数差异,然后在查询中添加或减去该偏移量以在两者之间进行转换。我可以想到其他一些方法,但它们都一样笨拙或更糟。当然有一个更干净,更优雅的方式,我忽略了?
1条答案
按热度按时间doinxwow1#
不要随意使用加/减时间值。
SYSDATE
返回数据库服务器操作系统的时区中的当前DATE
,所以我假设您正在寻找这个。您可以使用
TO_CHAR(SYSTIMESTAMP, 'tzr')
查询数据库服务器操作系统的时区试试这个: