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

Posted

技术标签:

【中文标题】如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?【英文标题】:How to convert a UTC timestamp to a named timezone in SAP SQL Anywhere? 【发布时间】: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 个月,则仅使用 当前 偏移量会产生错误的结果!

【问题讨论】:

【参考方案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 个月前或将来)是不正确的,因为夏令时状态,因此以分钟为单位的偏移量可能与今天的偏移量不同。

以上是关于如何在 SAP SQL Anywhere 中将 UTC 时间戳转换为命名时区?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL mobilink 与 SQL Anywhere 同步

SQL Anywhere5.5: Metadata

Sybase SQL Anywhere:LOAD TABLE 函数是不是在存储过程中工作?

sql SQL Anywhere:Mostrar Tablas y Campos de la Base de Datos

Sqoop 与 SQL Anywhere 17 连接

text SQL Anywhere卸载y重新加载Consola tabla por tabla