首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Oracle SQL:将时间戳转换为UTC

Oracle SQL:将时间戳转换为UTC
EN

Stack Overflow用户
提问于 2014-03-27 21:24:11
回答 4查看 83.1K关注 0票数 15

我有一个简单的select查询,如下所示,但我注意到我正在返回地区时间。如何在select语句中转换为UTC?

代码语言:javascript
复制
select myTimeStamp, MyName, MyBranch from tableA

结果:'27/03/2014 15:15:26‘’约翰‘,’伦敦‘

我曾尝试使用sys_extract_utc (myTimeStamp),但出现以下错误

sql命令未正确结束

myTimestamp的类型为'date‘。

EN

回答 4

Stack Overflow用户

发布于 2014-03-27 21:34:31

代码语言:javascript
复制
select cast(mytimestamp as timestamp) at time zone 'UTC', 
       MyName, 
       MyBranch 
from tableA

因为mytimestamp实际上是一个date,而不是时间戳,所以您需要对其进行强制转换。这样做会使Oracle假定存储在mytimestamp中的信息位于服务器-if的时区内,这与您使用Madhawas的解决方案所需的情况不同。

票数 20
EN

Stack Overflow用户

发布于 2014-03-27 23:08:44

根据类型的不同,存在一些关于Oracle从哪个时区转换的陷阱,具体取决于myTimestamp的数据类型。

带有时区的时间戳

它只在™上工作。a_horse_with_no_name在这里有正确的答案。

带有本地时区的时间戳

它被隐式地转换为带有时区的时间戳,然后它就会工作在™上。再说一次,a_horse_with_no_name就在这里。

时间戳

虽然它也被隐式地转换为带有时区时间戳,但是默认分配的时区是会话时区(与数据库时区相反)。

  • 显式调用这是myTimestamp at local.
  • Alternatively (而且很可能更好),您可以按照Madhawas所说的那样做,并使用from_tz函数显式地构建一个具有显式时区的值,而不是会话的时区。

日期

如您所述,尝试对date执行上述任一操作都将失败:

  • myTimestamp at time zone 'UTC'

ORA-30084:具有时区修饰符的datetime主数据类型无效

  • from_tz(myTimestamp, 'America/New_York')

ORA-00932:不一致的数据类型:预期的时间戳获取日期

这里的解决方案是首先将日期转换为时间戳:

代码语言:javascript
复制
select from_tz(cast(myTimestamp as timestamp), 'America/New_York') from tableA

示例脚本

以下脚本说明了该行为。请注意,在我的系统上,dbtimezone是US/Central,sessiontimezone是GMT-05:00。

我还使用to_char来转换输出,因为我发现一些工具会以微妙的方式改变结果时间戳,特别是当它们没有很好的时间戳支持时(这种情况现在很少见,但仍然是一个潜在的问题)。

代码语言:javascript
复制
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_format = 'YYYY-MM-DD HH24:MI:SS'
/
alter session set nls_timestamp_tz_format = 'YYYY-MM-DD HH24:MI:SS TZR'
/

select dbtimezone
      ,sessiontimezone
      ,to_char(timestamp '2017-01-01 06:00:00') as ts
      ,to_char(timestamp '2017-01-01 06:00:00' at local) as ts_at_local
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone dbtimezone) as ts_at_db
      ,to_char(timestamp '2017-01-01 06:00:00' at time zone sessiontimezone) as ts_at_session
 from dual
/

我的系统上的输出如下所示(为了可读性,重新设置为列的格式):

代码语言:javascript
复制
DBTIMEZONE          US/Central
SESSIONTIMEZONE     -05:00
TS                  2017-01-01 06:00:00
TS_AT_LOCAL         2017-01-01 06:00:00 -05:00
TS_AT_DB            2017-01-01 05:00:00 US/CENTRAL
TS_AT_SESSION       2017-01-01 06:00:00 -05:00
票数 10
EN

Stack Overflow用户

发布于 2014-03-27 22:40:35

你需要知道你的时区;

代码语言:javascript
复制
SELECT myTimeStamp, from_tz(myTimeStamp, 'America/New_York') AT TIME ZONE 'UTC' utc FROM dual;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22689021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档