暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将日期从一个时区转换为其他时区时出错

askTom 2017-07-18
599

问题描述

我想将某个时区中的日期转换为db时区中的日期。
现在由于某种原因,当我运行查询时,我被未知为timezone_region-
select extract(timezone_region from systimestamp) from dual;
复制


但是我能够使用这2个查询获得时区分钟和时区小时
SELECT EXTRACT(TIMEZONE_HOUR FROM SYSTIMESTAMP) into tz_hour FROM dual;
SELECT EXTRACT(TIMEZONE_MINUTE FROM SYSTIMESTAMP) into tz_min FROM dual;
复制


我看到我也可以使用这些值与 “at time zone” 一起将我的日期转换为所需的时区日期。
所以我运行了查询-

从abc的时区 “-7:0” 选择强制转换 (加载 _ 时间戳作为时间戳),其中 = ;

运行完美。

但是,当我尝试在pl/sql中运行相同的东西时,我会得到一个异常。
set serveroutput on;
   declare
   tz_hour varchar2(10);
   tz_min varchar2(10);
   l_output date;
   tz_full varchar2(20);
   begin
   SELECT EXTRACT(TIMEZONE_HOUR FROM SYSTIMESTAMP) into tz_hour FROM dual;
   SELECT EXTRACT(TIMEZONE_MINUTE FROM SYSTIMESTAMP) into tz_min FROM dual;
   tz_full := tz_hour||':'|| tz_min;
   dbms_output.put_line(tz_full);
   SELECT CAST(systimestamp at time zone tz_full AS DATE)
   INTO l_output from dual;
   dbms_output.put_line(l_output);
   end;
   /

Error report -
ORA-00905: missing keyword
ORA-06512: at line 11
00905. 00000 -  "missing keyword"
*Cause:    
*Action:
复制


伙计们知道为什么会这样吗

专家解答

你太复杂了。函数DBTimezone存储当前偏移量。所以你可以把这个传递给at时区表达式。

declare
  l_output   date;
begin

  select cast( systimestamp at time zone dbtimezone as date )
  into   l_output
  from   dual;
  
  dbms_output.put_line( l_output );
  
end;
/

18-JUL-2017 13:30:42
复制


不需要先从systimetamp中提取值!

您不能提取timezone_region,因为DB是使用小时和分钟偏移创建的,而不是区域。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论