我必须将日期时间转换为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'
如果有一种优雅的方式吗?而不是使用蹩脚的算术(然后必须考虑午夜,月末,年末等)。
由于
答案 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
希望我能正确理解你的要求。