我有一个简单的select查询,如下所示,但我注意到我正在返回地区时间。如何在select语句中转换为UTC?
select myTimeStamp, MyName, MyBranch from tableA
结果:'27/03/2014 15:15:26‘’约翰‘,’伦敦‘
我曾尝试使用sys_extract_utc (myTimeStamp),但出现以下错误
sql命令未正确结束
列myTimestamp
的类型为'date‘。
发布于 2014-03-27 21:34:31
select cast(mytimestamp as timestamp) at time zone 'UTC',
MyName,
MyBranch
from tableA
因为mytimestamp
实际上是一个date
,而不是时间戳,所以您需要对其进行强制转换。这样做会使Oracle假定存储在mytimestamp
中的信息位于服务器-if的时区内,这与您使用Madhawas的解决方案所需的情况不同。
发布于 2014-03-27 23:08:44
根据类型的不同,存在一些关于Oracle从哪个时区转换的陷阱,具体取决于myTimestamp
的数据类型。
带有时区的时间戳
它只在™上工作。a_horse_with_no_name在这里有正确的答案。
带有本地时区的时间戳
它被隐式地转换为带有时区的时间戳,然后它就会工作在™上。再说一次,a_horse_with_no_name就在这里。
时间戳
虽然它也被隐式地转换为带有时区的时间戳,但是默认分配的时区是会话时区(与数据库时区相反)。
myTimestamp at local
.from_tz
函数显式地构建一个具有显式时区的值,而不是会话的时区。日期
如您所述,尝试对date执行上述任一操作都将失败:
myTimestamp at time zone 'UTC'
ORA-30084:具有时区修饰符的datetime主数据类型无效
from_tz(myTimestamp, 'America/New_York')
ORA-00932:不一致的数据类型:预期的时间戳获取日期
这里的解决方案是首先将日期转换为时间戳:
select from_tz(cast(myTimestamp as timestamp), 'America/New_York') from tableA
示例脚本
以下脚本说明了该行为。请注意,在我的系统上,dbtimezone
是US/Central,sessiontimezone
是GMT-05:00。
我还使用to_char
来转换输出,因为我发现一些工具会以微妙的方式改变结果时间戳,特别是当它们没有很好的时间戳支持时(这种情况现在很少见,但仍然是一个潜在的问题)。
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
/
我的系统上的输出如下所示(为了可读性,重新设置为列的格式):
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
发布于 2014-03-27 22:40:35
你需要知道你的时区;
SELECT myTimeStamp, from_tz(myTimeStamp, 'America/New_York') AT TIME ZONE 'UTC' utc FROM dual;
https://stackoverflow.com/questions/22689021
复制相似问题