Oracle - 将UTC时间戳转换为本地时间(GMT / BST)时间戳

时间:2018-04-07 13:03:11

标签: oracle datetime utc

我必须将日期时间转换为UTC转换为本地时间(GMT / BST)

数据库中的日期为UTC,数据库设置为UTC。

我相信我可以使用TZ_OFFSET获取UTC和(比方说)BST之间的偏移量,但是如何使用它将UTC日期时间转换为BST日期时间?

因此,例如,如果数据库(UTC)日期时间是

     '2018-04-03 14:30:00'

偏移量为'+01:00'

我希望结果是

     '2018-04-03 15:30:00'

如果有一种优雅的方式吗?而不是使用蹩脚的算术(然后必须考虑午夜,月末,年末等)。

由于

3 个答案:

答案 0 :(得分:1)

使用FROM_TZ创建TIMSTAMP WITH TIME ZONE,然后转换非常简单,例如:

FROM_TZ({your column}, 'UTC') AT TIME ZONE 'Europe/London'

答案 1 :(得分:0)

正如您在文档中看到的那样:

Converting Time Zones With the AT TIME ZONE Clause的示例:

SELECT FROM_TZ(CAST(TO_DATE('1999-12-01 11:00:00',
     'YYYY-MM-DD HH:MI:SS') AS TIMESTAMP), 'America/New_York')
     AT TIME ZONE 'America/Los_Angeles' "West Coast Time"
FROM DUAL;

West Coast Time
----------------------------------------------------------
01-DEC-99 08.00.00.000000 AM AMERICA/LOS_ANGELES

因此,适用于您的案例场景:

SELECT FROM_TZ(CAST(TO_DATE('2018-04-03 14:30:00',
     'YYYY-MM-DD HH24:MI:SS') AS TIMESTAMP), 'UTC')
     AT TIME ZONE 'GMT' "Greenwich Mean Time"
FROM DUAL;

Greenwich Mean Time
----------------------------------------------------------
03-APR-18 02.30.00.000000 PM GMT

您可以通过以下方式获取可用时区列表:

SELECT tzname, tzabbrev FROM V$TIMEZONE_NAMES;

如果您的表格YOUR_TABLE包含some_timestamp列:

create table YOUR_TABLE (
    some_timestamp timestamp
);
/

insert into YOUR_TABLE (
 SOME_TIMESTAMP
) values (
  CAST(TO_DATE('2018-04-03 14:30:00', 'YYYY-MM-DD HH24:MI:SS') AS TIMESTAMP)
);

然后你可以运行:

select
  SOME_TIMESTAMP,
  FROM_TZ(SOME_TIMESTAMP, 'UTC') AT TIME ZONE 'GMT' "Greenwich Mean Time",
  FROM_TZ(SOME_TIMESTAMP, 'UTC') AT TIME ZONE 'Europe/London' "London Time"
from YOUR_TABLE;

SOME_TIMESTAMP                  Greenwich Mean Time              London Time
----------------------------------------------------------
03-APR-18 02.30.00.000000 PM    03-APR-18 02.30.00.000000 PM GMT    03-APR-18 03.30.00.000000 PM EUROPE/LONDON

如果您完全确定您的服务器是UTC,以及引入的时间戳,那么您可以跳过该UTC转换部分:

select
  SOME_TIMESTAMP,
  SOME_TIMESTAMP AT TIME ZONE 'GMT' "Greenwich Mean Time",
  SOME_TIMESTAMP AT TIME ZONE 'Europe/London' "London Time"
from YOUR_TABLE;

答案 2 :(得分:-1)

应该很简单::

select datetimecolumn + INTERVAL '1' HOUR from mytable

希望我能正确理解你的要求。