【问题标题】:How to convert a UTC timestamp to a named timezone in SAP SQL Anywhere?如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?
【发布时间】:2021-12-23 10:05:00
【问题描述】:

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

有没有一种简单的方法可以使用 SQL 将 UTC 时间戳转换为该时区的本地时间戳?假设我已经有created the timezone

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 个月,则仅使用 当前 偏移量会产生错误的结果!

【问题讨论】:

    标签: sql datetime timezone sqlanywhere


    【解决方案1】:

    在您的服务器上激活时区后,您有一个名为 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 时间戳(尽管我无法测试该函数,因为我的版本太旧了)。

    【讨论】:

    • 此函数使用 current 时区偏移量,因此使用它来转换任意时间戳(可能是 6 个月前或将来)是不正确的,因为夏令时状态,因此以分钟为单位的偏移量可能与今天的偏移量不同。
    猜你喜欢
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2019-03-09
    • 2014-05-06
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多