如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?

问题描述 投票:0回答:2

我正在使用 SAP SQL Anywhere 17,并且有一个时间戳(不含时区),我知道它是 UTC,并且我知道我的客户端浏览器报告的时区为“欧洲/柏林”。

是否有一种简单的方法可以使用 SQL 将 UTC 时间戳转换为该时区的本地时间戳?假设我已经创建了时区

CREATE TIME ZONE "Europe/Berlin" OFFSET '01:00'  DST OFFSET '01:00' DST STARTING 'Mar/last Sun' AT '02:00' DST ENDING 'Oct/last Sun' AT '02:00';

我想可以使用 SYSTIMEZONE 视图手动完成此操作,但处理所有特殊情况需要花费几个小时的努力!也许有人已经做到了,或者 Anywhere 提供了我在文档中忽略的系统功能。

请注意,问题是找出 DST 在任意 UTC 时间戳是否处于活动状态。例如,如果时间戳是未来 6 个月,仅使用 current 偏移量将给出错误的结果!

sql datetime timezone sqlanywhere
2个回答
0
投票

当您的服务器上激活时区时,您将有一个名为

TimeZoneAdjustment
的连接属性,它返回相对于 UTC 的分钟 数。对于欧洲/柏林,这是“60”(冬季/标准时间)。

您可以使用 DATEADD 函数

手动
添加偏移量:

SELECT CURRENT UTC TIMESTAMP AS my_utc_timestamp,
       DATEADD(minute, CONNECTION_PROPERTY('TimeZoneAdjustment'), my_utc_timestamp) AS localtime

较新版本的 SQL Anywhere 17 有一个新函数

TOLOCALDATE
,可以自动将当前连接的偏移量应用到 UTC 时间戳(尽管我无法测试该函数,因为我的版本太旧)。


0
投票

对于许多 Hana 系统,欧洲/柏林可能会在时区表中设置(对我来说)。 因此应该针对 DMT 进行调整。希望这对将来的人有帮助!

找到你的时区:

select * from TIMEZONES where TIMEZONE_name like '%Berlin%' 

如何使用:

select UTCTOLOCAL(TO_TIMESTAMP(my_col,'YYYYMMDDHHMISS'),'Europe/Berlin') 
from my_table

退货

20130324210347 2013-03-24 22:03:47.000000000

© www.soinside.com 2019 - 2024. All rights reserved.