oracle:如何获取本地时间戳而不是服务器时间戳

Posted

技术标签:

【中文标题】oracle:如何获取本地时间戳而不是服务器时间戳【英文标题】:oracle: how to get the local timestamp insteadof the server timestamp 【发布时间】:2016-07-08 14:26:58 【问题描述】:

假设我有一个表 foo,其中列 changed_colum 类型为 date。

现在我想从该列中获取本地时间戳,我尝试以下操作:

select TO_CHAR(cast (changed_colum as timestamp) at local, 'YYYY-MM-DD HH24:MI:SS TZR') from foo

result--->
2016-07-08 08:48:35 EUROPE/BERLIN

但这会打印应用程序服务器的日期。我需要会话的本地日期而不是服务器的本地日期。

有什么想法吗?

【问题讨论】:

由于changed_column 只是一个date,显然它不包含时区信息。该列中的时间数据是如何解释的?是UTC吗?其他?换句话说,如果数据显示Jul 8th @ 5PM,那就是5 PM,在哪个时区? 【参考方案1】:

根据 Oracle 在以下位置的文档: https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions079.htm#i999873

试试这个:

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;

这个:

SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

希望这会有所帮助。

【讨论】:

我需要一种从 created_colum 获取本地时间戳的方法。【参考方案2】:

不清楚你在问什么......如果你知道日期都是“使用服务器时区”,那么你可以使用

from_tz(cast (changed_column as timestamp), dbtimezone) at time zone sessiontimezone

然后根据需要对其进行格式化。

【讨论】:

【参考方案3】:

DATE 数据类型不包含任何时区信息。这些日期的时区是什么?除非您从应用程序的设计中不知道这一点,否则您无法转换。

AT LOCAL 等于AT TIME ZONE SESSIONTIMEZONE,即您的应用程序服务器在登录时设置的时区(或由ALTER SESSION SET TIME ZONE = ... 设置)。如果您喜欢这个时区等于您的客户端的时区,那么您必须在应用程序服务器上对此进行编码。

【讨论】:

以上是关于oracle:如何获取本地时间戳而不是服务器时间戳的主要内容,如果未能解决你的问题,请参考以下文章

获取时间戳而不是日期时间对象,sqlalchemy python 2.7

为啥 pandas 在调用 pd.to_datetime() 时返回时间戳而不是 datetime 对象?

如何将 MySql 时间戳列更新为 PHP 上的当前时间戳?

Oracle 字符串到日期到时间戳

oracle时间戳设置

如何从日历中获取 UTC 时间戳?