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

Oracle—将UTC时间戳转换为本地时间(GMT/BST)时间戳,oracle,datetime,utc,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' 如果有一个优雅的方式做这件事?而不是使用grungy算法(然后必须考

我必须创建一个将日期时间转换为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'
如果有一个优雅的方式做这件事?而不是使用grungy算法(然后必须考虑午夜、月底、年底等)


感谢您在文档中看到的:

例如:

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

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;
如果您有一个带有列
某个时间戳的表
您的\u表

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;

应该很简单::

select datetimecolumn + INTERVAL '1' HOUR from mytable

希望我正确理解你的要求

使用
FROM_TZ
创建带有时区的
TIMSTAMP
,则转换非常简单,例如:

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

你们是如何处理夏令时的?好问题,是的,我的解决方案不适合这个。谢谢。我认为UTC/BST的等效时间是从双时区的“欧洲/伦敦”时区的“伦敦时间”中选择的;但这与UTC返回的时间相同。(它似乎没有考虑到英国夏令时+1小时的调整)是的,因为你测试的是冬季的12月。试着在夏天约会,你会得到补偿。谢谢。那就对了!UTC与GMT基本相同,因此您的代码是无用的。Wernfried Domscheit,我正在回答定义的问题。这对于UTC->GMT是无用的,因为它们是相同的,但这不是问题所在。但是,我使用伦敦时区(夏季从GMT改为BST)更新了响应要明确这一点。
时区“欧洲/伦敦”的某些时间戳
不起作用,因为当您将
时间戳
日期
转换为带有时区的
时间戳时,Oracle会使用当前的
会话时区
(可以是任何东西)-而不是服务器时区。Wernfried Domscheit,如果您阅读问题,它会说:
数据库中的日期是UTC,并且数据库设置为UTC。
。如果你读了我的回复,我会说:
如果你绝对确定你的服务器在UTC…
@WernfriedDomscheit:GMT和UTC不一样;前者是英国时区冬季部分的标识符,在夏季切换到英国夏令时。UTC从不这样做。
FROM_TZ({your column}, 'UTC') AT TIME ZONE 'Europe/London'