我正在使用 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 偏移量将给出错误的结果!
当您的服务器上激活时区时,您将有一个名为
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 时间戳(尽管我无法测试该函数,因为我的版本太旧)。
对于许多 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