Oracle—将UTC时间戳转换为本地时间(GMT/BST)时间戳
我必须创建一个将日期时间转换为UTC的本地时间(GMT/BST) 数据库中的日期为UTC,数据库设置为UTC 我相信我可以使用TZ_offset获得UTC和(比如)BST之间的偏移量,但我如何使用它将UTC日期时间转换为BST日期时间 因此,例如,如果数据库(UTC)日期时间为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算法(然后必须考
'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'